【发布时间】:2021-05-14 10:55:38
【问题描述】:
我创建了一个如下所示的存储过程,但它只返回一行而不是 3:
CREATE PROCEDURE [dbo].[tempsp]
(@RecycleIds NVARCHAR(MAX) = NULL)
AS
BEGIN
DECLARE @Err INT
DECLARE @WhereClause NVARCHAR(MAX)
DECLARE @SQLText1 NVARCHAR(MAX)
DECLARE @SQLText NVARCHAR(MAX)
SET @SQLText1 = 'SELECT FROM dbo.SKU '
IF @RecycledSkuIds IS NOT NULL
BEGIN
SET @SQLText = 'SELECT FROM dbo.SKU WHERE SKU.SkuId IN (@RecycleIds)'
EXEC sp_executesql @SQLText, N'@RecycleSkuIds nvarchar', @RecycleIds
END
ELSE
BEGIN
EXEC(@SQLText1)
END
SET @Err = @@ERROR
RETURN @Err
END
-------end of stored procedure--------
EXEC tempsp @RecycleIds = '5,6,7'
运行这条SQL语句后,它只返回一行而不是3,id为5、6、7。
谁能告诉我我做错了什么? 我想使用 sp_executesql,这样它就可以安全地防止定义了强类型的 sql 注入。
【问题讨论】:
-
如果你像这样定义你的参数:
N'@RecycleSkuIds nvarchar',- 那么你得到一个长度为恰好一个字符的参数,这很可能不是你想要的。你真的应该养成在定义char(n)/nchar(n)/varchar(n)/nvarchar(n)列、变量或参数时总是定义显式长度的习惯!
标签: sql sql-server sp-executesql