使用局部变量值作为SQL Server的查询条件
背景:我想通过遍历所有可能的列来比较所有表中两个人记录的每一列。然后,我希望运行一个公共表表达式,该表达式在循环时使用每一列,如果第二个人列为NULL,我希望它根据特定条件用第一个人列的值更新所有重复记录 这将在删除一个副本之前,基本上遍历所有副本并更新它们以匹配 我正在运行一个循环表列的存储过程。我想在查询中使用这些列。以下是我所拥有的:使用局部变量值作为SQL Server的查询条件,sql,sql-server,Sql,Sql Server,背景:我想通过遍历所有可能的列来比较所有表中两个人记录的每一列。然后,我希望运行一个公共表表达式,该表达式在循环时使用每一列,如果第二个人列为NULL,我希望它根据特定条件用第一个人列的值更新所有重复记录 这将在删除一个副本之前,基本上遍历所有副本并更新它们以匹配 我正在运行一个循环表列的存储过程。我想在查询中使用这些列。以下是我所拥有的: declare table_columns cursor local dynamic for select BaseTable,
declare table_columns cursor local dynamic for
select BaseTable,
DBColumn
from viewTableInfo
declare @BaseTable nvarchar (100)
declare @DBColumn nvarchar (100)
open table_columns
while (1 = 1)
begin
fetch next from table_columns into @BaseTable, @DBColumn
if (@@FETCH_STATUS <> 0 ) break
;with CTE as
(
select firstName,
lastName,
@DBColumn AS Column,
rn = ROW_NUMBER()OVER(PARTITION BY firstName, lastName ORDER BY pID)
from Person p
inner join Company c ON c.pID = p.pID -- joined because variable may be column from Company table.
where p.pID in (1, 2)
)
select destinationProperty = case
when c1.Column = c2.Column then c2.Column
when c2.Column IS NULL THEN c1.Column
ELSE c2.Column END
from cte c1
inner join cte c2 on c1.firstName = c2.firstName and c1.lastName = c2.LastName and c2.rn = c1.rn + 1
当我运行它时,结果集中没有记录,因为公共表表达式选择变量@DBColumn的值,对于每个循环,它是实际的列名
我需要的是能够在查询中使用实际的列名,并为结果集中的每个pID获取该列的值
这可能吗?不确定此处使用游标和动态列名的确切要求,但您可以使用动态SQL获得所需的功能 将循环更改为不使用1=1,而是检查光标状态
declare table_columns cursor local dynamic for
select BaseTable,
DBColumn
from viewTableInfo
declare @BaseTable nvarchar (100)
declare @DBColumn nvarchar (100)
declare @query nvarchar(max)
open table_columns
fetch next from table_columns into @BaseTable, @DBColumn
WHILE @@FETCH_STATUS = 0
begin
set @query =';with CTE as
(
select firstName,
lastName,
' + @DBColumn + ' AS Column,
rn = ROW_NUMBER()OVER(PARTITION BY firstName, lastName ORDER BY pID)
from Person p
inner join Company c ON c.pID = p.pID -- joined because variable may be column from Company table.
where p.pID in (1, 2)
)
select destinationProperty = case
when c1.Column = c2.Column then c2.Column
when c2.Column IS NULL THEN c1.Column
ELSE c2.Column END
from cte c1
inner join cte c2 on c1.firstName = c2.firstName and c1.lastName = c2.LastName and c2.rn = c1.rn + 1'
exec sp_executesql @query
fetch next from table_columns into @BaseTable, @DBColumn
end
您需要编写动态sql并使用execk。在这里要小心……为什么要使用while1=1?因此,为什么要使用循环呢?我不完全理解您想做什么,但从您发布的内容来看,我根本看不到循环的必要性。@SeanLange我的光标从两条记录都具有的特定表中选择所有可用列。两个记录中这些列之间的值将不同。我想循环遍历每一列,并在其中一列为NULL时将它们设置为彼此相等。@我发现了一个动态SQL示例,但是我认为我不能在CTE中使用它,并且仍然引用列变量。这并不能很清楚地解释它,但这里确实不需要循环。这听起来像是一个来自语句的单个更新。谢谢,它按照我的需要工作。我希望我能澄清得更好,这里面有很多。不过你的回答完全奏效了。再次感谢。