首页 > 解决方案 > 将参数传递给 IN 运算符 SQL Server 的最佳方法是什么

问题描述

在我的 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 中注入一个危险的子句。那么最合适的解决方案是什么?

标签: sql-serverstored-proceduresin-operator

解决方案


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

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

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


推荐阅读