在我的WHERE子句

时间:2017-11-02 01:14:33

标签: sql ssrs-2012

我有两个表(tableA和tableB)都有一个名称列。 tableA的名称列可能被称为NAME,tableB&#39的列可能被称为FULLNAME,但它们都应该具有相同的值。

我要编写一个查询来提取成员ID(来自任一表),这两个列值不相同。但是,我想通过参数检查列名称,因为这将在SSRS报告中进行,并且将来我希望能够使用它来比较任何这两个表之间的其他列。

这样的事情:

DECLARE @COLUMN_A VARCHAR(50), @COLUMN_B VARCHAR(50)

/* COLUMN PARAMS WILL BE PASSED IN VIA SSRS */

SELECT
    DISTINCT(MEMBER_ID)
FROM
    TABLE_A
JOIN TABLE_B
    ON (TABLE_A.MEMBER_ID = TABLE_B.MEMBER_ID)
WHERE
    @COLUMN_A <> @COLUMN_B

这样的事情可能吗?

编辑:

或者可能这样的工作?

DECLARE @column VARCHAR(50)

SELECT @column = 'FIRST_NAME';
SELECT DISTINCT
    MEMBR_ID,
    case    
        when @column='FIRST_NAME' then MEMBR_FIRST_NAME
        when @column='LAST_NAME' then MEMBR_LAST_NAME


    end TABLE_1,
    case
        when @column='FIRST_NAME' then FIRSTNAME
        when @column='LAST_NAME' then LASTNAME
    end TABLE_2,
    @column
FROM 
    TABLE_1
JOIN    TABLE_2
    ON (TABLE_1.MEMBR_ID = TABLE_2.MEMBR_ID)

WHERE  
    TABLE_1.@column <> TABLE_2.@column  

1 个答案:

答案 0 :(得分:0)

  

这样的事情可能吗?

从技术上讲,语法很好。 where将比较两个常量字符串。结果将是所有行或没有行,具体取决于两个字符串是否相同。

这些评估到列吗?不,他们没有。您不能将参数传递给SQL语句中的标识符 - 列名,表名,模式名,数据库名,函数名或运算符(例如)。

您可以使用动态SQL执行此操作,但必须将名称插入:

DECLARE @sql NVARCHAR(MAX);

SET @sql = '
SELECT DISTINCT A.MEMBER_ID
FROM TABLE_A A JOIN
     TABLE_B B
     ON A.MEMBER_ID = B.MEMBER_ID
WHERE A.@COLUMN_A <> B.@COLUMN_B
';

SET @sql = REPLACE(@sql '@COLUMN_A', COLUMN_A);
SET @sql = REPLACE(@sql '@COLUMN_B', COLUMN_B);

exec sp_executesql @sql;