sql-server - 将参数传递给 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?从 2016 年开始,您可以使用 STRING_SPLIT:
https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql?view=sql-server-2017
或者您可以编写自己的函数将字符串拆分为表格。此方法将删除我认为您想要摆脱的动态 SQL。
推荐阅读
- reactjs - 尝试使用 react 和 .NET WebApi OAuth 登录时出现 net::ERR_ABORTED 400
- node.js - vue/vuex/router 中的循环引用。开玩笑的警告
- r - 在 R 中使用 abline 绘制回归
- javascript - 使用 setState 后如何返回预览状态?
- css - CSS 网格不再响应
- amazon-web-services - 使用 splunk 查询查找平均响应时间
- node.js - 如何让我的 discord.js 机器人使用 ytdl-core 播放播放列表中的歌曲?
- python - 在“while”循环期间扩展列表
- python - Skimage调整大小方法改变颜色
- javacc - 使用 JavaCC 为小型编程语言构建解释器