T-SQL通信 侧重安全与效率
数字职场
在实际开发工作中,如果需要访问SQL Server数据库,则必须要用到Transact-SQL——与SQL Server 通信的语句,使用该语句时要注意安全和效率。所以招聘考试中,常常会出现与T-SQL使用相关的考题。
招聘题目:用T-SQL求证
小小+霸霸+王王=小霸王
小=?,霸=?,王=?
题目答案:
declare @xbw int,@x int,@b int,@w int
set @xbw=100
while (@xbw<=999)
begin
set @x=@xbw/100
set @b=@xbw/10 % 10
set @w=@xbw % 10
if((@x*10+@x)+(@b*10+@b)+(@w*10+@w)=@xbw)
begin
select @xbw 小霸王,@x 小,@b 霸,@w 王
break
end
set @xbw=@xbw+1
end
T-SQL的应用
考官出此题的目的,主要在于测试应聘人员的T-SQL水平。T-SQL应用广泛,主要是网站和部分软件会用到——这些软件多是一些网络软件和行业软件,例如论坛需要保存用户信息、财务软件需要访问历史记录等。
总而言之,只要和SQL Server交互,就需要使用T-SQL,所以掌握T-SQL是十分有必要的,关于T-SQL的详细内容,可以访问http://msdn.microsoft.com/zh-cn/library/bb510741(v=SQL.100).aspx。
T-SQL的开发
T-SQL在实际开发中是如何运用的?如何避免T-SQL开发中出现安全问题呢?如何提高查询效率呢?我们通过两组代码进行说明。
第一组代码要实现的功能是用户登录论坛,系统在数据库中查找对应的用户名是否存在。
代码1:
SQL="select * from usertable where username='"+txtUser.Text+"' and pwd='"+txtPassword.Text+"'"
点评:这段代码表面上看没有任何问题,但是如果有人在用户名处输入“' or 1=1——”,这时候访问数据库的实际SQL语句就变成了"select * from usertable where username='' or 1=1"(——表示忽略后面的语句),这样黑客就可以不用知道用户名就能访问网站的数据库,代码完全没有安全性。
代码2:
SQL="select * from usertable where username=@user and pwd=@pwd"
点评:这段代码始终会把用户输入作为一个参数值处理,不会有安全问题。
第二组代码要实现的功能是通过T-SQL语句查询销售记录。
代码1:
DECLARE @i INT, @count INT, @sql nvarchar(4000)
SET @i = 10000
WHILE @i <= 20000
BEGIN
SET @sql = 'SELECT @count=count(*) FROM [Order Details] WHERE ORDERID = ' + cast( @i as varchar(10) )
EXEC sp_executesql @sql ,N'@count INT OUTPUT', @count OUTPUT
SET @i = @i + 1
END
点评:这段代码使用变量拼成SQL语句,每次生成的语句都不同,而SQL Server 对不同的语句每次执行前都要生成执行计划并储存到内存中,这样就极大地浪费了内存,也影响了执行速度。
代码2:
DECLARE @i INT, @count INT, @sql nvarchar(4000)
SET @i = 10000
WHILE @i <= 20000
BEGIN
SET @sql = 'SELECT @count=count(*) FROM [Order Details] WHERE ORDERID = @i'
EXEC sp_executesql @sql, N'@count int output, @i int', @count OUTPUT, @i
SET @i = @i + 1
END
点评:代码1需要10秒,代码2只要1秒。代码2中SQL Server可以重复使用执行计划,而代码1是由变量拼成的不同SQL语句,每一条都需要一个新的执行计划,SQL Server无法重复使用。