在项目开发过程中,遇到数据库的查询问题

一、查询某表字段的信息

select * from syscolumns
SELECT object_id('TB_KYChildProject')
select * from syscolumns where id=object_id('TB_KYChildProject') and name='IsInheritAdd'

二、表字段添加说明

go
if exists(select 1 from sys.extended_properties p where
p.major_id = object_id('TB_KYChildProject')
and p.minor_id = (select c.column_id from sys.columns c where c.object_id = p.major_id and c.name = 'ChildProjectManageName')
)
begin
declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_dropextendedproperty 'MS_Description',
'user', @CurrentUser, 'table', 'TB_KYChildProject', 'column', 'ChildProjectManageName'
end select @CurrentUser = user_name()
execute sp_addextendedproperty 'MS_Description',
'子项目经理名称',
'user', @CurrentUser, 'table', 'TB_KYChildProject', 'column', 'ChildProjectManageName'
go

TB_KYChildProject是表名,ChildProjectManageName字段名,子项目经理名称是字段说明

三、将查询结果记录转换成 Insert SQL 语句

USE [BJSkyTwo_Dev]
GO
/****** Object: StoredProcedure [dbo].[pCreateInsertScript] Script Date: 10/31/2017 15:24:40 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--@tablename 表名,@con 条件
--EXEC pCreateInsertScript @tablename = 'Find01_FindSetting',@con = 'Find01Find00ID =58'
ALTER proc [dbo].[pCreateInsertScript] (@tablename varchar(256),@IsIncludeIdentityColumn BIT=0,@con varchar(MAX))
as
BEGIN
DECLARE @ID INT
SET @ID=object_id(@tablename)
declare @sql varchar(MAX)
declare @sqlValues varchar(MAX)
set @sql =' ('
set @sqlValues = 'values (''+'
select @sqlValues = @sqlValues + cols + ' + '','' + ' ,@sql = @sql + '[' + name + '],'
from
(select case
when xtype in (48,52,56,59,60,62,104,106,108,122,127)
then 'case when '+ name +' is null then ''NULL'' else ' + 'cast('+ name + ' as varchar)'+' end' when xtype in (58,61)
then 'case when '+ name +' is null then ''NULL'' else '+''''''''' + ' + 'cast('+ name +' as varchar)'+ '+'''''''''+' end'
when xtype in (167)
then 'case when '+ name +' is null then ''NULL'' else '+''''''''' + ' + 'replace('+ name+','''''''','''''''''''')' + '+'''''''''+' end'
when xtype in (35)
then 'case when '+ name +' is null then ''NULL'' else '+''''''''' + ' + 'replace('+ 'cast('+ name + ' as varchar)'+','''''''','''''''''''')' + '+'''''''''+' end'
when xtype in (231)
then 'case when '+ name +' is null then ''NULL'' else '+'''N'''''' + ' + 'replace('+ name+','''''''','''''''''''')' + '+'''''''''+' end'
when xtype in (175)
then 'case when '+ name +' is null then ''NULL'' else '+''''''''' + ' + 'cast(replace('+ name+','''''''','''''''''''') as Char(' + cast(length as varchar) + '))+'''''''''+' end'
when xtype in (239)
then 'case when '+ name +' is null then ''NULL'' else '+'''N'''''' + ' + 'cast(replace('+ name+','''''''','''''''''''') as Char(' + cast(length as varchar) + '))+'''''''''+' end'
--when xtype in (36)
ELSE 'case when '+ name +' is null then ''NULL'' else '+'''N'''''' + ' + 'replace('+ name+','''''''','''''''''''')' + '+'''''''''+' end' --else '''NULL'''
end as Cols,name
from syscolumns
where id = @ID
AND 1=(CASE WHEN @IsIncludeIdentityColumn=0 AND COLUMNPROPERTY(@ID,[name], 'IsIdentity') = 1 THEN 0 ELSE 1 END)
) T
set @sql ='select ''INSERT INTO ['+ @tablename + ']' + left(@sql,len(@sql)-1)+') ' + left(@sqlValues,len(@sqlValues)-4) + ')'' from '+@tablename+' where 1=1 and '+@con
print @sql
exec (@sql)
end

用法:

dbo.pCreateInsertScript @tablename = 'System_Menu', -- varchar(256)
@IsIncludeIdentityColumn = 0, -- bit
@con = 'MenuName = ''监理任务派单''' -- varchar(max)

 存在的问题:

PRINT只能打印4000的Unicode string或8000的Non-unicode string,过长会导致字符串被截断

四、外键ID字符串拼接成对应名称字符串

转换成

方法一:

SELECT  a.userID ,
STUFF(( SELECT ',' + System_Role.RoleName
FROM System_Role
WHERE CHARINDEX(','
+ CONVERT(VARCHAR(36), System_Role.RoleID)
+ ',', ',' + a.RoleIDs + ',') > 0
ORDER BY System_Role.RoleID
FOR
XML PATH('')
), 1, 1, '') AS RoleNames
FROM System_Users a

方法二:

WITH    mt
AS ( SELECT a.UserID ,
b.RoleID ,
b.RoleName
FROM System_Users a ,
System_Role b
WHERE ',' + a.RoleIDs + ',' LIKE '%,'
+ CONVERT(VARCHAR(36), b.RoleID) + ',%'
)
SELECT UserID ,
STUFF(( SELECT ',' + RoleName
FROM mt a
WHERE a.UserID = mt.UserID
FOR
XML PATH('')
), 1, 1, '') RoleNames
FROM mt
GROUP BY UserID

五、统计某个类型占总数的比例

SELECT
SUM(CASE WHEN a.Sub_Project_Type =101 THEN 1
ELSE 0
END)*1.0 / COUNT(*) 类型比例
FROM TB_KYSubProject a

效果:

六、用户所属的专业类型

思路一:

SELECT  a.* ,
STUFF(( SELECT ',' + CONVERT(VARCHAR(100), b.RoleMajorType)
FROM System_Role b
WHERE CHARINDEX(',' + CONVERT(VARCHAR(36), b.RoleID) + ',',
',' + a.RoleIDs + ',') > 0
GROUP BY b.RoleMajorType
FOR
XML PATH('')
), 1, 1, '') AS RoleMajorType
FROM System_Users a

效果:

思路二(不推荐):

SELECT  a.* ,
STUFF(( SELECT DISTINCT
( ',' + CONVERT(NVARCHAR(10), r.RoleMajorType) )
FROM ( SELECT a.UserID ,
b.RoleID
FROM System_Users a
CROSS APPLY ( SELECT CAST(col AS UNIQUEIDENTIFIER) RoleID
FROM fn_split(RoleIDs,
',')
) b
) ru
LEFT JOIN dbo.System_Role r ON r.RoleID = ru.RoleID
WHERE ru.UserID = a.UserID
FOR
XML PATH('')
), 1, 1, '') AS RoleMajorType
FROM System_Users a
WHERE 1 = 1

效果:

七、截取字符串

1|216|368|截取成1|216|,1|2112|3683|21|截取成1|2112|

推荐

select LEFT('1|216|368|',CHARINDEX ('|', '1|216|368|' , CHARINDEX ('|', '1|216|368|')+1))

不推荐

select LEFT('1|216|368|',charindex('|',stuff('1|216|368|',charindex('|','1|216|368|'),1,',')))

SQL 语句解决实际问题的更多相关文章

  1. (转载)sql语句解决分页问题

    <来源网址:http://www.delphifans.com/infoview/Article_353.html>sql语句解决分页问题日期:2005年1月17日 作者:treemon2 ...

  2. SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题

    目标:减少SQL查询数据,避免使用一条SQL语句解决复杂问题 反模式:视图使用一步操作,单个SQL语句解决复杂问题 使用一个查询来获得所有结果的最常见后果就是产生了一个笛卡尔积.导致查询性能降低. 如 ...

  3. 如何用ORM支持SQL语句的CASE WHEN?

    OQL如何支持CASE WHEN? 今天,一个朋友问我,OQL可否支持CASE WHEN语句?他给的示例SQL如下: then '启用' else '停用' from tb_User OQL是SOD框 ...

  4. JAVA 拼接了一个sql 语句,但是最后运行报错——SQL 命令未正确结束

    错误原因: 拼接的时候因为引号里的部分是直接引起来的,所以将这些语句整个拼接起来的时候就会成为一个“没有断句”的sql语句,如下面我的错误 将整句话拼接起来就相当于   select * from B ...

  5. Spring3+MyBatis3整合log4j无法输出SQL语句问题的解决

    今天遇到了跟下面文章一模一样的问题,下面文章的解决方案很好,在这里记录保存一下. Spring3+MyBatis3整合无法输出SQL语句问题的解决

  6. Sql语句不能识别Go的解决办法(动态创建表的触发器)

    问题来源 用sqlserver直接打开sql文本,执行没问题,但是当用Sqlcommand类执行cmdtext命令文本时总是失败报错. 原因分析及解决 用数据库直接执行sql语句没问题,甚至还可以用G ...

  7. sql语句用'in'执行多条语句时候,执行错误的解决方法

    一般报错是出现,无法将nvarchar类型转换为int类型 这是因为 SqlParameter  带参数  是不能用  , 分割的. 第一种解决方法就是  不用 SqlParameter  带参数的s ...

  8. SQL语句表名或者字段名和保留字冲突解决方法

    最近开发遇到一个很奇葩的问题,简单做一下笔记 select * from Add ... 以上SQL语句会报错. 原因Add是表名,SQL语句保留字中又有Add 解决方法: select * from ...

  9. 解决linux环境mysql的sql语句严格区分大小写问题

    在Windows环境下,mysql数据库的sql语句是不区分字母大小写的,但是程序移植到linux环境中,就会造成某些大小写不一致的语句执行失败,解决方法如下: 首先打开/etc/mysql/my.c ...

随机推荐

  1. java使用new Date()和System.currentTimeMillis()获取当前时间戳(转载)

    转自:http://www.cnblogs.com/wuchen/archive/2012/06/30/2570746.html 在开发过程中,通常很多人都习惯使用new Date()来获取当前时间, ...

  2. 博客使用的CSS代码备份

    CSS代码备份 /*simplememory*/ #google_ad_c1, #google_ad_c2 { display: none; } .syntaxhighlighter a, .synt ...

  3. TP5之自定义分页样式

    分页样式为 在extend\目录下创建page目录,在page目录下创建Page.php文件,将以下代码放入文件中. <?php namespace page; use think\Pagina ...

  4. 51单片机 小车 L298N pwm调速 串口控制 按键控制

    难点:1.串口定时器T1,和T0定时器优先级 2.pwm频率与占空比的设置 按键控制 按键1——前进 按键2——后退 按键3——加速 按键4——减速 (板子上只有四个按键) 串口控制 ‘1’——前进 ...

  5. noi,ac第五场部分题解 By cellur925

    题目质量还是不错的,只是我太菜了== 传送门 T1:序列计数(count) 题目描述 长度为n+1的序列A,其中的每个数都是不大于n的正整数,且n以内每个正整数至少出现一次. 对于每一个正整数k=1, ...

  6. PostgreSQL - psql的使用与退出

    PostgreSQL连接数据库的两种方式 PostgreSQL在安装时自带了pgAdmin和psql,pgAdmin是可视化工具,psql是命令行工具.虽然pgAdmin操作起来会更加直观简单,但是在 ...

  7. VS2017专业版使用最新版Qt5.9.2教程(最新教材)

    QT配置  Creator    ================================================================= 之前运行release版本或者de ...

  8. codeforces 615 D. Multipliers (数论 + 小费马定理 + 素数)

    题目链接: codeforces 615 D. Multipliers 题目描述: 给出n个素数,这n个素数的乘积等于s,问p的所有因子相乘等于多少? 解题思路: 需要求出每一个素数的贡献值,设定在这 ...

  9. 模拟 Codeforces Round #297 (Div. 2) A. Vitaliy and Pie

    题目传送门 /* 模拟:这就是一道模拟水题,看到标签是贪心,还以为错了呢 题目倒是很长:) */ #include <cstdio> #include <algorithm> ...

  10. 513 Find Bottom Left Tree Value 找树左下角的值

    给定一个二叉树,在树的最后一行找到最左边的值. 详见:https://leetcode.com/problems/find-bottom-left-tree-value/description/ C+ ...