1

列名と値の 2 つの値を受け入れるストアドを作成しようとしています。次に、渡された列名に値が渡されたレコードが存在するかどうかを確認します。私は次のことを試しました

CREATE PROCEDURE p_HasActiveReference
     @pi_colName varchar(100)
    ,@pi_colValue varchar(100)
AS
BEGIN
SET NOCOUNT ON      
    declare @sql varchar(1000)

    set @sql = 'IF EXISTS(SELECT TOP 1 p.PaymentId
                FROM Payments p
                WHERE ' + @pi_colName + ' = ' + @pi_colValue +     'AND Active = 1)

                    SELECT ''True'' AS RETVAL
                ELSE
                    SELECT ''False'' AS RETVAL'
    exec(@sql)  
 END

ただし、常にこのエラーが発生します

varchar 値 'InternalOr' をデータ型 int に変換するときに変換に失敗しました。

次の手順を呼び出すと

p_HasActiveReference 'InternalOrgCode', '10110'

internalOrgCode列は価値があるvarchar(10)

私は SQL の専門家ではないので、その手法を使用して達成する必要があることが可能かどうかさえわかりません!

ありがとう!

4

1 に答える 1

3

少なくとも 1 つの問題: 文字列値を一重引用符で囲む必要があり、文字列内でそれらをエスケープするには、二重にする必要があります。

WHERE ' + @pi_colName + ' = ''' + @pi_colValue + ''' AND ...

@sql 変数を 100 文字を超えるものとして宣言することもできます。文字列が切り捨てられているようです。

@pi_colName の可能な値が有限で、データ型が常に文字列で、列が照合に対応している場合、次のようにして動的 SQL を回避できます。

SELECT ...
WHERE CASE @pi_colName 
  WHEN 'col1' THEN col1
  WHEN 'col2' THEN col2
END = @pi_ColValue;
于 2012-08-23T14:40:09.980 に答える