T-SQL:类似于C#params的概念

时间:2009-10-30 18:53:15

标签: sql sql-server-2005 tsql

T-SQL是否允许在C#中为params这样的存储过程提供可变数量的参数?

编辑:我正在使用SQL Server 2005. 2008年的答案让我希望我们使用它...

5 个答案:

答案 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

我确信有更好的方法来实现这一点,这是我在网上发现的一种方式,它适用于我正在做的事情。如果有一些改进可以发表评论。