2010-11-30 20 views
0

如果我想寫下如下的程序,是否還有其他一些方法, 爲了避免使用連接SQL語句,我只是怕,如果輸入太長,超過max varchar的限制,代碼會有很大的問題。如何在程序中編寫批量SQL查詢

感謝

CREATE PROCEDURE UPDATE_ALL_STATUS 
    @IDs varchar(MAX) = null, 
    @status int = null 
AS 
BEGIN 
    IF @IDs is null 
    BEGIN 
     RETURN 
    END 

    DECLARE @SQL VARCHAR(MAX) 

    SET @SQL = 'UPDATE mytable SET status = ' + @status + ' WHERE id in (' + @IDs + ')' 
    EXECUTE @SQL 
END 

回答

4

而不是動態SQL(這也是容易SQL Injection Attacks),並傳遞一個VARCHAR(MAX),可以考慮使用Table Valued Parameters

-- Creates the TVP type - only needed once! 
CREATE TYPE IntegerTableType AS TABLE 
(Identities INT); 
GO 

CREATE PROCEDURE UPDATE_ALL_STATUS 
    @IDs IntegerTableType READONLY, 
    @status int = null 
AS 
BEGIN 

    UPDATE mytable 
    SET status = @status 
    WHERE id IN 
    (SELECT Identities FROM @IDs) 

END 

This MSDN article演示如何調用這些從你的.NET代碼。

+1

嗨Oded,非常感謝你的答案。還有一個問題,在創建新類型之後,在C#代碼中,我需要使用SQL語句來調用此過程,但我的代碼如何知道新類型? – jojo 2010-11-30 22:56:12