SQL 脚本收录
有些数据库语句可能平时用得不多,所以使用的时候总是难免上网查询,略嫌麻烦,特此收录
具体实现如下,如下语句执行后,会在查询分析器执行消息中显示执行数据库的所有存储过程源码,直接复制保存文本即可。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 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 = 0
12 BEGIN
13 print @proc_text
14 FETCH NEXT FROM get_proc_text_cursor
15 INTO @proc_text
16 END
17 CLOSE get_proc_text_cursor
18 DEALLOCATE get_proc_text_cursor
SQL字符串分割自定义函数:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 -- =============================================
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
数据库备份操作:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 declare @sql varchar(8000)
2 set @sql='backup database 数据库名 to disk=''d:\'+RTRIM(CONVERT(varchar,getdate(),112))+'.bak'''
3 exec(@sql);
标识列从1开始计数的问题 :
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 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变量,必须先把输入插入一个目标表,然后再从目标表例取值赋给该变量
查某一列有重复值的记录(此方法查出的是所有重复的记录,如果有两条记录重复的,就查出两条:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 select * from stuinfo
2 where stuid in (
3 select stuid from stuinfo
4 group by stuid
5 having(count(*))>1
6 )
----------------------替换数据表中每个字符段内中的特殊值------------------------
--鉴于获取数据表的列表数据时候经常需要获取字段名称。特整理了下如下代码。
--适用场合:设计或者更新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
)
经验来源于实践,来源于生活中的点滴注意。学会总结,学会注意,学会发现...你也能浴火重生,跳脱升华...