【发布时间】:2013-01-21 05:53:53
【问题描述】:
我写了两个存储过程,一个是sp_executesql,另一个没有 sp_executesql
两者都正确执行相同的结果,我没有明白这里有什么区别
EXEC (@SQL) 与 EXEC sp_executesql @SQL, N'@eStatus varchar(12)', @eStatus = @Status
而 EXEC(@SQL) 是如何容易发生 SQL 注入的,而 sp_executesql @SQL......不是吗?
下面没有 sp_executesql 的存储过程
ALTER proc USP_GetEmpByStatus
(
@Status varchar(12)
)
AS
BEGIN
DECLARE @TableName AS sysname = 'Employee'
Declare @Columns as sysname = '*'
DECLARE @SQL as nvarchar(128) = 'select ' + @Columns + ' from ' + @TableName + ' where Status=' + char(39) + @Status + char(39)
print (@SQL)
EXEC (@SQL)
END
EXEC USP_GetEmpByStatus 'Active'
下面的存储过程用 sp_executesql
create proc USP_GetEmpByStatusWithSpExcute
(
@Status varchar(12)
)
AS
BEGIN
DECLARE @TableName AS sysname = 'JProCo.dbo.Employee'
Declare @Columns as sysname = '*'
DECLARE @SQL as nvarchar(128) = 'select ' + @Columns + ' from ' + @TableName + ' where Status=' + char(39) + @Status + char(39)
print @SQL
exec sp_executesql @SQL, N'@eStatus varchar(12)', @eStatus = @Status
END
EXEC USP_GetEmpByStatusWithSpExcute 'Active'
【问题讨论】:
标签: sql sql-server sql-server-2008 stored-procedures sql-server-2012