Transact-SQL 一些语法:
类似pascal 但有些区别:
语句块:
begin
end
if语句:
if (Boolean) //没有 Then
begin
end //没有结束符;
else
begin
end
while 循环
while(Boolean)
begin
end
打印输出:
print @value
执行字符串变量的语句
1,EXECUTE(@SqlQuery)
2,调用存储过程sp_executesql
如
set @SqlCount = 'select @RecordSum = count(*) from ' + @Table + ' ' + @Where
exec sp_executesql @SqlCount, N'@RecordSum int output', @RecordSum output
获取Transact-SQL 语句影响的行数的信息。
@@rowcount
在设置Set Nocount on 之后,系统常量@@rowcount不会被影响.
使用游标变量
声明:declare @sql varchar(100)
赋值:set @sql ='select ..'
使用游标保存结果集:
游标作用:对select筛选出的结果集进行逐行、遍历、多行操作。
用法
1,声明 declare 游标名 cursor for select(语句) --这是只进游标,只能使用fetch next操作
declare 游标名 SCROLL cursor for select(语句)--这是滚动游标,可以随意操作
2,打开 open 游标名
3,滚动游标使用
fetch next from 游标名 into 变量名//下一
fetch prior from 游标名 into 变量名 //前一
fetch first from 游标名 into 变量名 //第一
fetch prior from 游标名 into 变量名 //前一
fetch absolute n from 游标名 into 变量名 //第n行
fetch relative n from 游标名 into 变量名 //相对当前行第n行
只进的游标只支持--fetch next from
4,关闭游标 close 游标名称
5,释放游标 deallocate 游标名称
@@Fetch_Status
返回针对连接当前打开的任何游标发出的上一条游标 FETCH 语句的状态。
返回值 | 描述 |
---|---|
0 | FETCH 语句成功。 |
-1 | FETCH 语句失败或此行不在结果集中。 |
-2 | 被提取的行不存在。 |
示例:
DECLARE @result int
DECLARE cursor_name FOR select value,* from test
open cursor_name
FETCH NEXT FROM Declaretest into @result
while @@FETCH_STATUS=0
begin
print @result
FETCH NEXT FROM Declaretest into @result
end
Close Declaretest
Deallocate Declaretest
游标其他应用:
修改当前游标所在行的用户的余额,我们可以如下操作:
UPDATE customer
SET balance=1000
WHERE CURRENT of customerCursor;
删除当前行的操作如下:
DELETE FROM Customer
WHERE CURRENT OF CustomerCursor;
动态游标的应用(游标的执行语句是动态的)
declare @text varchar(1000)
declare @sql varchar(1000)
set @text='declare aa cursor for '+@bb
EXEC(@text);
--然后再打开cursor,再使用。
T-SQL 字符串前加 N 是什么意思
N 在这里表示 Unicode,就是双字节字符。对于西文字符,用一个字节来存储过足够了,对于东方文字字符,就需要两个字节来存储。Unicode 为了统一、规范、方便、兼容,就规定西文字符也用两个字节来存储。
也就是说加 N 就表示字符串用 Unicode 方式存储。
但有时候加与不加都一样,又是什么原因呢?这是由于自动转换造成的。
比如:
declare @status nvarchar(20)
select @status = N'stopped'
select @status = 'stopped'
实际上上述两句赋值的结果是一样的,因为变量类型就是 nvarchar(Unicode 类型)。
而有些地方(比如:sp_executesql 的参数)不能自动转换,所以需要加 N 了。