建立一个能够在SQL Server子句存储过程动态(Creating a dynamic where

2019-07-31 04:16发布

我试图创建一个存储,将接受两个值,列名和值。 然后,它会检查是否有存在于列名与价值传递的传递的记录。 我已经试过以下

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专家,所以我也不知道我需要什么,以实现使用这种技术甚至有可能!

谢谢!

Answer 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;


文章来源: Creating a dynamic where clause in SQL Server stored procedure