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 ...
随机推荐
- Mysql数据库实现高可用
Mysql实现高可用 MMM MMM(master-master replication manager for mysql)mysql主主复制管理器. MMM是一套灵活的脚本程序,基于perl实现, ...
- template code 引用的一些问题
1.问题: 引用同一个norlib.tt 下面的tt . 一个KSTrade 正确. 一个 NDAP就报错. 报错说源文件某个函数有错误 helper.Common.tt 错误 2.结果: NDAP ...
- (数位DP)51NOD 1042 数字0-9的数量
给出一段区间a-b,统计这个区间内0-9出现的次数. 比如 10-19,1出现11次(10,11,12,13,14,15,16,17,18,19,其中11包括2个1),其余数字各出现1次. 输入 ...
- 用CSS绘制三角形
其实用HTML CSS绘制三角行 是非常简单的 ,我在网上看了不少人写的博客,里面写的好复杂样子,反正我是看的云里雾里的,说实话是挺简单的. 首先提出一段代码: <!DOCTYPE html&g ...
- Python文件将日志文件中每天的日志拿出来
file_log.txt文件内容如下: with open('file_log.txt', 'r', encoding='utf-8') as f: for i in f: s = i.split() ...
- tsconfig.json No inputs were found in config file
Build:No inputs were found in config file '/tsconfig.json'. Specified 'include' paths were '["* ...
- pip 安装管理失败解决
问题: pip install ansible 错误: src/hash_template.c:361: warning: implicit declaration of function ‘Py_F ...
- js去掉数组的空字符串
后台返回数据的时候,有些数据为空时,一般都不进行显示,需要去除空字符串. 基本思路:获取数组张度,遍历数组,当数组某个值等于‘’或null或数据类型为undefined时,根据splice方法去除数据 ...
- 多线程wait和notify实现1212
package threadT; public class ThreadMain { public static void main(String args[]) { final Object obj ...
- 让jquery.tmpl支持序号${index}
参考 http://blog.csdn.net/wangji5850/article/details/50913121 压缩的查找第一个map,添加 jQuery.map( h, function( ...