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