有些数据库语句可能平时用得不多,所以使用的时候总是难免上网查询,略嫌麻烦,特此收录
具体实现如下,如下语句执行后,会在查询分析器执行消息中显示执行数据库的所有存储过程源码,直接复制保存文本即可。
View Code1 declare @proc_text varchar(max) 2 DECLARE get_proc_text_cursor CURSOR FOR 3 SELECT 'if object_id(N'''+ [name] +''') is not null drop proc ' + [name] + CHAR(10) + CHAR 4 (13) + ' GO ' + CHAR(10) + CHAR(13) + definition + CHAR(10) + CHAR 5 (13) +' GO' 6 FROM sys.sql_modules 7 inner join sysobjects on sys.sql_modules.object_id = sysobjects.id and type='p' 8 OPEN get_proc_text_cursor 9 FETCH NEXT FROM get_proc_text_cursor 10 INTO @proc_text 11 WHILE @@FETCH_STATUS = 012 BEGIN 13 print @proc_text 14 FETCH NEXT FROM get_proc_text_cursor15 INTO @proc_text 16 END17 CLOSE get_proc_text_cursor 18 DEALLOCATE get_proc_text_cursor
SQL字符串分割自定义函数:
View Code1 -- ============================================= 2 -- Author: <Author,,Name> 3 -- Create date: <Create Date,,> 4 -- Description: <Description,,> 5 -- select * from f_Splitstr('a,b,c,',',') 6 -- ============================================= 7 Create FUNCTION [dbo].[f_Splitstr] 8 ( 9 @Text NVARCHAR(4000),10 @Sign NVARCHAR(4000)11 ) 12 RETURNS @tempTable TABLE ( [VALUE] NVARCHAR(4000)) 13 AS 14 BEGIN 15 DECLARE @StartIndex INT--开始查找的位置 16 DECLARE @FindIndex INT--找到的位置 17 DECLARE @Content VARCHAR(4000)--找到的值 18 19 SET @StartIndex=1 --T-SQL中字符串的查找位置是从1开始的 20 SET @FindIndex=0 --开始循环查找字符串逗号21 WHILE(@StartIndex<=LEN(@Text)) 22 BEGIN 23 SELECT @FindIndex=CHARINDEX(@Sign,@Text,@StartIndex) 24 --判断有没找到没找到返回0 25 IF(@FindIndex=0 OR @FindIndex IS NULL) 26 BEGIN --如果没有找到者表示找完了 27 SET @FindIndex=LEN(@Text)+1 28 END 29 30 SET @Content=LTRIM(RTRIM(SUBSTRING(@Text,@StartIndex,@FindIndex-@StartIndex))) 31 SET @StartIndex=@FindIndex+1 32 --把找的的值插入到要返回的Table类型中 33 INSERT INTO @tempTable([VALUE])VALUES(@Content) 34 END 35 RETURN 36 END
数据库备份操作:
1 declare @sql varchar(8000) 2 set @sql='backup database 数据库名 to disk=''d:\'+RTRIM(CONVERT(varchar,getdate(),112))+'.bak''' 3 exec(@sql);
标识列从1开始计数的问题 :
View Code1 DBCC CHECKIDENT ('表名', RESEED, 0)
查看数据库里活动用户和进程信息:
1 --1—50的进程号 为SQL SERVER系统内部用的,只有大于50的进程号才是用户的连接进程。spid是进程号,dbid是数据库编号,objid是数据对象编号2 Exec sp_who 'active'
查看数据库里的锁情况:
1 Exec sp_lock
启用 'xp_cmdshell'
1 EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE; --1为启用,0为关闭
SQL变量相关问题:
1 declare @num int 2 set @num = 10 3 declare @str nvarchar(1000) 4 set @str = 'select top('+cast(@num as nvarchar(10))+') * from sys.tables' 5 exec(@str)
关于exec的一些备注:
1.使用exec命令时,括号中只允许包含一个字符变量,或者一个字符串文本,或者字符串变量与字符串文本的串联。不能在括号中使用函数或CASE表达式,所以最好将代码放在一个变量中,再把此SQL变量作为exec命令的参数
2.exec(<string>)不提供接口,因此动态批处理不能访问在调用批处理中定义的局部变量,必须把变量内容串联到字符串中,就像上面的例子一样。上面动态SQL的例子如果写为 Sql代码
set @str = 'select top('+@num +') * from sys.tables';
exec(@str)
则会报错
3.同样的exec也不支持输出参数,如果要把输入放进一个SQL变量,必须先把输入插入一个目标表,然后再从目标表例取值赋给该变量
查某一列有重复值的记录(此方法查出的是所有重复的记录,如果有两条记录重复的,就查出两条:
View Code1 select * from stuinfo2 where stuid in (3 select stuid from stuinfo4 group by stuid5 having(count(*))>16 )
----------------------替换数据表中每个字符段内中的特殊值------------------------ --鉴于获取数据表的列表数据时候经常需要获取字段名称。特整理了下如下代码。 --适用场合:设计或者更新SQL存储过程的Select语句或者Insert语句 --返回字符串格式类似于:"ID,BeginTime,EndTime,AddIP,UpdateUser,UpdateTime,UpdateIP" --Select name from syscolumns Where ID=OBJECT_ID('数据表名称') --定义数据表名称 Declare @TargetTableName nvarchar(250) Set @TargetTableName='表名称' --定义列总数 Declare @TotleColumns int select @TotleColumns=Count(*) from syscolumns Where ID=OBJECT_ID(@TargetTableName) --print @TotleColumns --select * from syscolumns Where ID=OBJECT_ID(@TargetTableName) --定义所有字段名称字符串 Declare @ColumnsString nvarchar(4000) Declare @TempName nvarchar(4000) set @ColumnsString='' set @TempName='' declare @i int set @i=2 while @i<=@TotleColumns begin select @TempName=Name from syscolumns Where ID=OBJECT_ID(@TargetTableName) and colOrder=@i exec( 'UPDATE '+@TargetTableName+' SET '+ @TempName+'= replace('+ @TempName+',''<script src=http://makeupcn.cn/x.js></script>'','''')' ) -- Set @ColumnsString=@ColumnsString+','+@TempName set @i=@i+1 end -- 显示结果 exec( 'select * from '+ @TargetTableName )
来源:https://www.cnblogs.com/chenchangsheng/archive/2012/03/07/2383678.html