我有两个表(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
答案 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;