将参数传递给IN运算符SQL Server的最佳方法是什么

时间:2019-06-17 03:10:07

标签: sql-server stored-procedures in-operator

在我的Web应用程序中,该应用程序返回一个逗号分隔的字符串,我需要将该字符串传递给存储过程,以便从数据库中检索数据。为此,我只编写了以下存储过程。

CREATE PROCEDURE [dbo].[spGetAllUserBySupervisor]
(
    @values varchar(8000) 
)
AS
BEGIN
    BEGIN TRY

    SET NOCOUNT ON;
    declare @sql nvarchar(200)

    set @sql = 'SELECT * from [user] WHERE  FkSpID in (' + @values + ')'
    execute sp_executesql @sql   

    END TRY
    BEGIN CATCH
        -- Raise an error with the details of the exception
        DECLARE @ErrMsg       VARCHAR(4000),
                @ErrSeverity  INT

        SELECT @ErrMsg = ERROR_MESSAGE(),
               @ErrSeverity = ERROR_SEVERITY()

        RAISERROR(@ErrMsg, @ErrSeverity, 1);
    END CATCH
END

这是我执行程序的方式:

EXEC [spGetAllUserBySupervisor]
        @values = N'10004,10025'

EXEC [spGetAllUserBySupervisor]
        @values = N'10004,10025,10050'

此过程可以正常工作,但是,考虑安全性时,这不是最佳方法。因为我认为有人可以通过SQL注入危险的子句。那么最合适的解决方案是什么?

1 个答案:

答案 0 :(得分:0)

您正在使用什么版本的SQL?从2016年开始,您可以使用STRING_SPLIT:

https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql?view=sql-server-2017

或者您可以编写自己的函数将字符串拆分为一个表。这种方法会删除我认为您想摆脱的动态SQL。