是否有一种优雅的方法来处理将id列表作为参数传递给存储过程?
例如,我希望我的存储过程返回的部门1,2,5,7,20.在过去,我已经通过逗号分隔的id列表,如下面的代码,但感觉真的很脏.
我认为SQL Server 2005是我唯一适用的限制.
create procedure getDepartments
@DepartmentIds varchar(max)
as
declare @Sql varchar(max)
select @Sql = 'select [Name] from Department where DepartmentId in (' + @DepartmentIds + ')'
exec(@Sql)
Run Code Online (Sandbox Code Playgroud) 我需要将一个"id"的数组传递给一个存储过程,删除表中的所有行,除了与数组中的id匹配的行.
我怎么能以最简单的方式做到这一点?
我有一个查询,我想返回与值列表关联的所有行.你可以这么简单地写成:
select * from TableA where ColumnB in (1, 2, 3, 5)
Run Code Online (Sandbox Code Playgroud)
我可以用C#生成这个查询并执行它.然而,这显然不太理想,因为它不使用参数,它会在尝试缓存查询计划时受到影响,并且显然容易受到SQL注入攻击.
另一种方法是将其写为:
select * from TableA where ColumnB = @value
Run Code Online (Sandbox Code Playgroud)
这可以通过C#执行多次,但这会导致N DB命中.
我能看到的另一个替代方案是创建一个临时表并以这种方式加入它,但是我没有看到这一点,因为它会更复杂并且受到与第一个选项相同的限制.
我正在使用SQL Server和OLDB,创建查询不是问题.我正在努力创造最有效的流程.
这三种方法中哪一种更有效?我错过了替代方案吗?
这是场景; 我有一个与OrderIds相关的CustomerIds(1,2,3)列表.我有一个存储过程Delete_OrdersByCustomerIds,它删除与指定的CustomerIds相关的所有订单.
目前,我这样做的方法是将CustomerIds连接成一个字符串,即"1,2,3".然后我将此字符串传递给我的存储过程并使用以下函数创建一个我可以加入的Int表:
CREATE FUNCTION [dbo].[iter$simple_intlist_to_tbl] (@list nvarchar(MAX))
RETURNS @tbl TABLE (number int NOT NULL) AS
BEGIN
DECLARE @pos int,
@nextpos int,
@valuelen int
SELECT @pos = 0, @nextpos = 1
WHILE @nextpos > 0
BEGIN
SELECT @nextpos = charindex(',', @list, @pos + 1)
SELECT @valuelen = CASE WHEN @nextpos > 0
THEN @nextpos
ELSE len(@list) + 1
END - @pos - 1
INSERT @tbl (number)
VALUES (convert(int, …Run Code Online (Sandbox Code Playgroud)