2010-11-30 6 views
0

のバッチSQLクエリを書く方法私は、以下のような手続きを書いている場合は、 は、入力が長すぎる場合は、私は恐れている連結SQL文を避けるために、最大varcharの制限は、コードは大きな問題を抱えています。手続き

おかげ

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 Injection Attacksに対して脆弱である)、動的SQLと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

こんにちは、私は答えを大変ありがとうございました。もう1つの質問は、新しい型を作成した後、C#コードで、私はこのプロシージャを呼び出すためにSQL文を使用する必要がありますが、私のコードはどのように新しい型を知ることができますか? – jojo

+0

@shrimpy - ここにはいくつかの例があります:http://msdn.microsoft.com/en-us/library/bb675163.aspx – Oded