使用局部变量值作为SQL Server的查询条件

使用局部变量值作为SQL Server的查询条件,sql,sql-server,Sql,Sql Server,背景:我想通过遍历所有可能的列来比较所有表中两个人记录的每一列。然后,我希望运行一个公共表表达式,该表达式在循环时使用每一列,如果第二个人列为NULL,我希望它根据特定条件用第一个人列的值更新所有重复记录 这将在删除一个副本之前,基本上遍历所有副本并更新它们以匹配 我正在运行一个循环表列的存储过程。我想在查询中使用这些列。以下是我所拥有的: declare table_columns cursor local dynamic for select BaseTable,

背景:我想通过遍历所有可能的列来比较所有表中两个人记录的每一列。然后,我希望运行一个公共表表达式,该表达式在循环时使用每一列,如果第二个人列为NULL,我希望它根据特定条件用第一个人列的值更新所有重复记录

这将在删除一个副本之前,基本上遍历所有副本并更新它们以匹配

我正在运行一个循环表列的存储过程。我想在查询中使用这些列。以下是我所拥有的:

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中使用它,并且仍然引用列变量。这并不能很清楚地解释它,但这里确实不需要循环。这听起来像是一个来自语句的单个更新。谢谢,它按照我的需要工作。我希望我能澄清得更好,这里面有很多。不过你的回答完全奏效了。再次感谢。