1

我正在尝试创建一个存储,它将接受两个值,一个列名和一个值。然后它将检查是否存在具有传入值的传入列名的记录。我试过以下

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

至少有一个问题:您应该用单引号括住您的字符串值,并且要转义字符串中的那些值,您需要将它们加倍:

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