使用一系列IF语句设置SQL变量

时间:2016-07-21 17:12:46

标签: sql-server tsql

我有一个表格,可以将某些列与另一个表中的列进行比较。如果列已更改,我想最终更改" Notes"字段以警告已更改的内容。不止一列可以改变。

简而言之,我声明了变量,我想用更改的内容更新该变量,然后使用变量更新列。

在Access中,我可以很容易地做到这一点,但是我花了两天时间尝试在SQL中完成此操作无济于事。

Declare @NewUpdate nvarchar(max)

If B.RCustNmbr <> A.RSQ_Custnmbr Set @NewUpdate = 'CustNmbr changed from ' & A.RSQ_Custnmbr & ' to ' & B.RCustNmbr & ', '

If B.RCustName <> A.RSQ_CUSTNAME Set @NewUpdate = **@NewUpdate** & 'CustName changed from ' & A.RSQ_CUSTNAME & ' to ' & B.RCustName & ', ' 

Update A
Set A.[Notes] = @NewUpdate & " on today's date " & A.[Notes] *(to include notes that might've been there before)*
From [Table1] A Inner Join  [Table2] B on A.ID = B.ID

然后我想重置@NewUpdate变量以获取下一个ID(所以设置@NewUpdate = Null)

你能指出我正确的方向来完成这项工作吗?我真的不确定如何引用我的A&amp; A If语句中的B表。我尝试过很多东西。这是最接近的:

Declare @NewUpdate nvarchar(max)

Set @NewUpdate = (Select 'CustName changed from ' + A.RSQ_CustName + ' to ' + B.RCustName + ', '
From [Customer Master List] A INNER JOIN [Customer Master List Changes TEMP] B ON A.ID = B.ID
Where **A.ID = 566** and B.RCustName <> A.RSQ_CustName)

(以上查询格式化):

Declare @NewUpdate nvarchar(max)

Set @NewUpdate = 
   (Select 'CustName changed from ' + A.RSQ_CustName + ' to ' + B.RCustName + ', '
      From [Customer Master List] A
INNER JOIN [Customer Master List Changes TEMP] B ON A.ID = B.ID
Where A.ID = 566 and B.RCustName <> A.RSQ_CustName)

但是我必须将它限制为1个ID或者我得到错误 Subquery返回的值超过1。当子查询跟随=,等等时,这是不允许的。我需要为数千条记录执行此操作。

2 个答案:

答案 0 :(得分:1)

假设这两个表有一个公共密钥列,您可以使用这样的查询来识别更改。如果列不是基于字符的,则必须使用CAST,但这为您提供了基本的想法。

SELECT d.*
  FROM (SELECT a.key,
               CASE WHEN a.col1<>b.col1
                 THEN 'col1 changed from ' + a.col1 + ' to ' + b.col1 + ','
                 ELSE ''
               END 
               + CASE WHEN a.col2<>b.col2
                   THEN 'col2 changed from ' + a.col2 + ' to ' + b.col2 + ','
                   ELSE ''
                 END AS diff
          FROM a INNER JOIN b ON a.key = b.key) d
 WHERE d.diff <> ''

然后,您可以使用上面作为自己的子查询来连接到包含note列的表;听起来像是一张原始表中的音符栏。

UPDATE a
   SET a.note = n.diff
  FROM a INNER JOIN (<above select>) n ON a.key = n.key

答案 1 :(得分:0)

使用UPDATE FROM

UPDATE Table
SET Notes = R.Notes
   From
(
    Select 
         A.TableId
        'CustName changed from ' + A.RSQ_CustName + ' to ' + B.RCustName + ', ' AS Notes
    From 
        [Customer Master List] A INNER JOIN 
        [Customer Master List Changes TEMP] B ON A.ID = B.ID
    Where 
        A.ID = 566 and 
        B.RCustName <> A.RSQ_CustName
) R
WHERE
    Table.Id = R.TableId