我编写了两个存储过程,其中一个使用了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'