T-SQL是否允许在C#中为params
这样的存储过程提供可变数量的参数?
编辑:我正在使用SQL Server 2005. 2008年的答案让我希望我们使用它...
答案 0 :(得分:3)
在SQL 2008中,有表值参数(TVP)
您的存储过程可以接受参数列表..
最后,我们可以在不依赖XML的情况下执行IN子句!
麦克
答案 1 :(得分:2)
不,不适用于UDF或存储过程。这就是表格的用途。将值放在某个表格中(使用公共密钥)并将正确的密钥传递给您的过程。
答案 2 :(得分:1)
典型地
CREATE PROCEDURE dbo.sptest
( @xml TEXT )
AS
BEGIN
DECLARE @flag1 INT
DECLARE @flag2 VARCHAR(50)
DECLARE @flag3 DATETIME
DECLARE @idoc INT
exec sp_xml_preparedocument @idoc OUTPUT, @xml
SELECT @flag1 = firstparam, flag2 = secondparam, flag3 = thirdparam
FROM OPENXML(@idoc, '/root', 2) WITH
( firstparam INT, secondparam VARCHAR(50), thirdparam DATETIME) as x
END
exec sptest '<root><firstparam>5</firstparam><secondparam>Joes Bar</secondparam><thirdparam>12/30/2010</thirdparam></root>'
根据需要延长
答案 3 :(得分:0)
我看到传递给params或数组的另一种方法是传入XML字符串,将其转储到临时表/表变量并从那时起使用它。想要手动运行存储过程并不是最简单的,但它可以解决缺少数组/动态参数支持的问题。
答案 4 :(得分:0)
我使用了一个小函数将CSV字符串分隔为表格
那样我就可以了
SELECT col1, col2
FROM myTable
WHERE myTable.ID IN (SELECT ID FROM dbo.SplitIDs('1,2,3,4,5...'))
我的功能如下:
CREATE FUNCTION [dbo].[SplitIDs]
(
@IDList varchar(500)
)
RETURNS
@ParsedList table
(
ID int
)
AS
BEGIN
DECLARE @ID varchar(10), @Pos int
SET @IDList = LTRIM(RTRIM(@IDList))+ ','
SET @Pos = CHARINDEX(',', @IDList, 1)
IF REPLACE(@IDList, ',', '') <> ''
BEGIN
WHILE @Pos > 0
BEGIN
SET @ID = LTRIM(RTRIM(LEFT(@IDList, @Pos - 1)))
IF @ID <> ''
BEGIN
INSERT INTO @ParsedList (ID)
VALUES (CAST(@ID AS int)) --Use Appropriate conversion
END
SET @IDList = RIGHT(@IDList, LEN(@IDList) - @Pos)
SET @Pos = CHARINDEX(',', @IDList, 1)
END
END
RETURN
END
我确信有更好的方法来实现这一点,这是我在网上发现的一种方式,它适用于我正在做的事情。如果有一些改进可以发表评论。