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 ...
随机推荐
- ObjectARX学习笔记
http://blog.csdn.net/jangdong/article/category/1642265/3 http://blog.csdn.net/u011331383/article/cat ...
- Codeforces Round #421 (Div. 2)B. Mister B and Angle in Polygon(模拟+精度控制)
传送门 题意 给出正n多边形和一个数a,寻找与a最接近的角,输出角编号 分析 找出多边形上所有角,一一比对即可 trick 1.判断的时候注意精度,i.e.x-eps>0 2.double与do ...
- IT兄弟连 JavaWeb教程 Servlet转发
Servlet对象由Servlet容器创建,并且Servlet对象的service()方法也由容器调用,一个Servlet对象可否直接调用另一个Servlet对象的service()方法呢?答案是否定 ...
- wpf 中AxShockwaveFlash重写以及屏蔽鼠标右键
在wpf中需要用到flash播放swf或者图片,需要使用 AxShockwaveFlashObjects.dll和ShockwaveFlashObjects.dll 在项目中使用的时候遇到 问题1.使 ...
- 3分钟入门微信小程序直播
效果预览 开发环境搭建 安装微信开发者工具 相对于以前微信以前的产品来说.小程序在发布之初就面向开发者开放微信开发者工具.使开发者更加方便的开发和调试小程序.我们从官网下载安装.官网下载地址.现在 ...
- hdu1598 find the most comfortable road 枚举+最小生成树
#include<cstdio> #include<cstring> #include<algorithm> #define MAXN 210 #define IN ...
- iOS 自建企业级应用(In-House)分发平台
注意事项 自建分发平台,首先需要有一个可以提供下载功能的服务器,而且服务器需要支持HTTPS协议! 其实,使用七牛云就可以完成这些操作. 推荐方案 七牛云实践方案简述(感兴趣的朋友可以和我交流具体的实 ...
- android 百度地图
展示当前位置地图 参考百度定位demo (LocationDemo) 实现此功能,运行发现 BDLocationListener 的onReceiveLocation方法无法执行,原因是 Androi ...
- 跟我一起玩Win32开发(23):渐变颜色填充
GradientFill函数可以对特定的矩形区域或者三角形区域进行渐变颜色的填充.我们先来看看GradientFill函数到底长得什么样子,帅不帅. BOOL GradientFill( _In_ ...
- C++伪函数
#include <iostream> void say_hello() { std::cout << "hello world !" << s ...