从c#向SQL Server存储过程发送ID列表

时间:2008-10-08 14:22:54

标签: c# sql stored-procedures

是否可以从c#向存储过程发送ID列表而不会出现乱码?

UPDATE Germs
SET Mutated = ~Mutated
WHERE (GermID IN (ids))

4 个答案:

答案 0 :(得分:2)

这可能是一个肮脏的黑客,但你可以创建一个临时表,然后从你的存储过程中加入它(假设它们在同一个连接期间被访问)。例如:

CREATE TABLE #ids (id int)
INSERT INTO #ids VALUES ('123') -- your C# code would generate all of the inserts

-- From within your stored procedure...
UPDATE g
SET Mutated = ~Mutated
FROM Germs g
JOIN #ids i ON g.GermID = i.id

答案 1 :(得分:2)

您可以尝试我所做的事情: -

创建一个名为Split_String的函数

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

CREATE FUNCTION [dbo].[Split_String] 
(   
    @MyString varchar(5000)
)
RETURNS @Results TABLE
(
    Value varchar(1000)
) 
AS
    BEGIN
        DECLARE @Pos int
        DECLARE @StrLen int
        DECLARE @MyLen int
        DECLARE @MyVal varchar
        SET @pos = 1
        SET @MyLen = 1
        WHILE @MyString <> ''
            BEGIN
                SET @MyLen = charindex(',',@MyString)   
                IF @MyLen = 0 SET @MyLen = Len(@MyString)
                INSERT @Results SELECT replace(substring(@MyString, @pos, @MyLen),',','')
                SET @MyString = SUBSTRING(@MyString,@MyLen+1,len(@MyString))
            END
        RETURN 
    END

然后当您使用IN()时,请使用逗号分隔的字符串: -

SELECT * FROM [youDataBase].[dbo].[Split_String] (<@MyString, varchar(5000),>)

答案 2 :(得分:0)

根据This文章,您可以尝试表值参数。

答案 3 :(得分:0)

是的,您可以使用一大块XML来构建ID列表。然后,您可以使用OPENXML并从该记录集中进行选择。

查找OPENXML,sp_preparexmldocument,sp_removexmldocument