SQL 脚本收录

有些数据库语句可能平时用得不多,所以使用的时候总是难免上网查询,略嫌麻烦,特此收录

 具体实现如下,如下语句执行后,会在查询分析器执行消息中显示执行数据库的所有存储过程源码,直接复制保存文本即可。

View Code
 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字符串分割自定义函数:

View Code
 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


 数据库备份操作:

View Code
1 declare @sql varchar(8000) 
2 set @sql='backup database 数据库名 to disk=''d:\'+RTRIM(CONVERT(varchar,getdate(),112))+'.bak'''
3 exec(@sql);

标识列从1开始计数的问题 :

View Code
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变量,必须先把输入插入一个目标表,然后再从目标表例取值赋给该变量

 

 查某一列有重复值的记录(此方法查出的是所有重复的记录,如果有两条记录重复的,就查出两条:

View Code
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
)

 



posted @ 2012-03-07 15:57  kensheng  阅读(157)  评论(0编辑  收藏  举报