SQL 语句解决实际问题
在项目开发过程中,遇到数据库的查询问题
一、查询某表字段的信息
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 语句解决实际问题的更多相关文章
- (转载)sql语句解决分页问题
<来源网址:http://www.delphifans.com/infoview/Article_353.html>sql语句解决分页问题日期:2005年1月17日 作者:treemon2 ...
- SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题
目标:减少SQL查询数据,避免使用一条SQL语句解决复杂问题 反模式:视图使用一步操作,单个SQL语句解决复杂问题 使用一个查询来获得所有结果的最常见后果就是产生了一个笛卡尔积.导致查询性能降低. 如 ...
- 如何用ORM支持SQL语句的CASE WHEN?
OQL如何支持CASE WHEN? 今天,一个朋友问我,OQL可否支持CASE WHEN语句?他给的示例SQL如下: then '启用' else '停用' from tb_User OQL是SOD框 ...
- JAVA 拼接了一个sql 语句,但是最后运行报错——SQL 命令未正确结束
错误原因: 拼接的时候因为引号里的部分是直接引起来的,所以将这些语句整个拼接起来的时候就会成为一个“没有断句”的sql语句,如下面我的错误 将整句话拼接起来就相当于 select * from B ...
- Spring3+MyBatis3整合log4j无法输出SQL语句问题的解决
今天遇到了跟下面文章一模一样的问题,下面文章的解决方案很好,在这里记录保存一下. Spring3+MyBatis3整合无法输出SQL语句问题的解决
- Sql语句不能识别Go的解决办法(动态创建表的触发器)
问题来源 用sqlserver直接打开sql文本,执行没问题,但是当用Sqlcommand类执行cmdtext命令文本时总是失败报错. 原因分析及解决 用数据库直接执行sql语句没问题,甚至还可以用G ...
- sql语句用'in'执行多条语句时候,执行错误的解决方法
一般报错是出现,无法将nvarchar类型转换为int类型 这是因为 SqlParameter 带参数 是不能用 , 分割的. 第一种解决方法就是 不用 SqlParameter 带参数的s ...
- SQL语句表名或者字段名和保留字冲突解决方法
最近开发遇到一个很奇葩的问题,简单做一下笔记 select * from Add ... 以上SQL语句会报错. 原因Add是表名,SQL语句保留字中又有Add 解决方法: select * from ...
- 解决linux环境mysql的sql语句严格区分大小写问题
在Windows环境下,mysql数据库的sql语句是不区分字母大小写的,但是程序移植到linux环境中,就会造成某些大小写不一致的语句执行失败,解决方法如下: 首先打开/etc/mysql/my.c ...
随机推荐
- sql常识性误解
今天在公司一个项目,遇到一个问题,最后解决下来竟然发现自己对sql竟然存在一个常识性的误解 表数据 需求如下 查找 name中的数据被参数 'adsb' 包含的的列 个人原先的误区一直在于一个认识, ...
- AssetDatabase文档翻译
AssetDatabase是一个能获取工程资源的API,它提供一些方法比如:查找.加载.创建.删除和修改.Unity需要了解工程文件夹里的所有改变,假如想要获取或修改资源文件,就使用 AssetDat ...
- python __builtins__ dict类 (17)
17.'dict', 用于创建一个字典. class dict(object) | dict() -> new empty dictionary # 空字典 | dict(mapping) -& ...
- Jquery禁用网页右键菜单
$(function(){ $(document).bind("contextmenu",function(e){ return false; }); });
- mybaits 连接数据库汉字保存乱码??
查看数据库连接地址: jdbc.url=jdbc:mysql://localhost:3306/az?useUnicode=true&characterEncoding=utf-8 多了一个a ...
- 跟我一起玩Win32开发(24):计时器
有好些时间没写博客了,今天要来耍一下计时器,就是我们常说的Timer,它虽然不是什么复杂的东西,也称不 上牛X,不过,用处还是不少的,对于那些需要每隔一定时间执行一次的任务,那是相当有用. 先来认识一 ...
- bzoj 5018 [Snoi2017]英雄联盟
题面 https://www.lydsy.com/JudgeOnline/problem.php?id=5018 题解 简单的dp 令dp[i][j]表示前i个英雄 总花费为j 最大能够得到的展示种数 ...
- [NOIP2018校模拟赛]T1聚会 party
题目链接: 聚会 分析: 设每个点到1号点的距离为dist_{i},每个点的权值为x_{i},目标点到1号点的距离为dist,权值为x,那么对于每一次查询,我们讨论三种情况: ① 目标家庭在区间左边( ...
- jQuery将json字符串显示在页面上
js代码: function syntaxHighlight(json) { if (typeof json != 'string') { json = JSON.stringify(json, un ...
- json数组某个数值对应渲染
当你统计某一年的某个值它对应的月份总数时,后台没有直接处理好,某个月对应某个值,这样会增加统计的负担,但当数据时这样的时候,在angularjs中时不能直接引用的. "data": ...