2016-05-26 24 views
6

我在我的SQL Server中有兩個表使用SQL子查詢或動態查詢更新配置表中的一個表列值

表沒有。 1

CREATE TABLE #Config 
(
    varColumnName VARCHAR(200) , 
    varAliasName VARCHAR(200) 
) 

INSERT INTO #Config (varColumnName, varAliasName) 
VALUES ('Consumed (Strips)', 'decQuantity'), 
     ('Closing (Strips)', 'decClosing') 

表沒有。 2

CREATE TABLE #Data 
(
    decQuantity DECIMAL(18, 2) , 
    decClosing DECIMAL(18, 2) , 
    varInvalidRemarks VARCHAR(MAX) 
) 

INSERT INTO #Data (decQuantity, decClosing) 
VALUES (10.10, 25.00), 
     (-15.10, 45.00), 
     (5.10, -10.00), 
     (-25.10, -10.00) 

從這兩個表我想更新#Data表的varInvalidRemarks列和我想要的follwing輸出:

decQuantity | decClosing | varInvalidRemarks 
-------------|------------|-------------------------- 
     10.10 |  25.00 |  
     -15.10 |  45.00 | Consumed (Strips) can NOT be negetive 
     5.10 | -10.00 | Closing (Strips) can NOT be negetive 
     -25.10 | -10.00 | Consumed (Strips) can not be negetive,Closing(Strips) can not be negetive 

我做這件事情有FAST FORWARD READ ONLY光標,但我想這樣做子查詢或動態查詢。

DECLARE @varColumnName VARCHAR(200) , 
@varAliasName VARCHAR(200) 

DECLARE DisplayColumn CURSOR FAST_FORWARD READ_ONLY 
FOR 
SELECT C.varColumnName , 
     C.varAliasName 
FROM #Config AS C 

OPEN DisplayColumn 

FETCH NEXT FROM DisplayColumn INTO @varColumnName, @varAliasName 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    EXEC (' 
    UPDATE D 
    SET  D.varInvalidRemarks = isnull(D.varInvalidRemarks,'''') + 
    '','[email protected] +' can not be negative '' 
    FROM #Data AS D 
    WHERE CAST(ISNULL(D.'[email protected]+', 0) AS DECIMAL(18, 2)) < 0 

    ') 

    FETCH NEXT FROM DisplayColumn INTO @varColumnName, @varAliasName 

END 

CLOSE DisplayColumn 
DEALLOCATE DisplayColumn 

我想這樣做,因爲我的存儲過程中的性能問題。

是否有可能通過子查詢來實現這件事?

感謝

+0

向我們顯示您的光標查詢。 – pedram

+1

爲什麼不用'CASE'表達式來做呢? –

+1

'SELECT \t decQuantity, \t decClosing, \t varInvalidremarks = STUFF(( \t \t SELECT \t \t \t CASE WHEN decQuantity <0 THEN '消耗(條)不能爲負' ELSE '' END + \t \t \t CASE WHEN decClosing <0 THEN '關閉(條)不能爲負' ELSE '' END \t \t),1,1, '') FROM #DATA ' –

回答

3

這是一個動態的SQL解決方案。請參閱打印動態查詢

declare @sql nvarchar(max), 
    @col nvarchar(max) 

select @col = isnull(@col + 'UNION ALL' + char(13), '') 
     + 'SELECT rmk = ''' + c.varColumnName + ' cannot be negative'' WHERE ' + quotename(c.varAliasName) + ' < 0' + char(13) 
from #Config c 

select @sql = isnull(@sql, '') 
     + N'UPDATE D SET varInvalidRemarks = STUFF(V.Remarks, 1, 1, '''')' + char(13) 
     + N'FROM #Data D'       + char(13) 
     + N'OUTER APPLY'       + char(13) 
     + N'('         + char(13) 
     + N'SELECT '','' + rmk'       + char(13) 
     + N'FROM'        + char(13) 
     + N'('         + char(13) 
     + @col         + char(13) 
     + N') V'        + char(13) 
     + N'FOR XML PATH ('''')'      + char(13) 
     + N') V (Remarks)'       + char(13) 
FROM #Config c 

print @col 
print @sql 
exec sp_executesql @sql 
+0

正是我在找什麼。非常感謝你 – navnit

1

你可以做的,而不是使用光標這樣的存儲過程。

UPDATE #Data 
SET varInvalidRemarks = ISNULL(
      STUFF((SELECT CASE WHEN decQuantity < 0 THEN ',Consumed (Strips) cannot be negative' ELSE '' END 
          + CASE WHEN decClosing < 0 THEN ',Closing (Strips) cannot be negative' ELSE '' END 
       ),1,1,''), 
      '' 
     ) 
1

像這樣的東西應該工作:如果#config.varColumnName

UPDATE #Data 
    SET varInvalidremarks = STUFF((
     SELECT 
      CASE WHEN decQuantity < 0 THEN ',Consumed (Strips) cannot be negative' ELSE '' END + 
      CASE WHEN decClosing < 0 THEN ',Closing (Strips) cannot be negative' ELSE '' END 
     ),1, 1, '') 

然而,:

UPDATE #Data 
SET varInvalidRemarks = 
    CASE 
    WHEN decQuantity < 0 AND decClosing < 0 
    THEN 'Consumed (Strips) can NOT be negative,Closing(Strips) can not be negative' 
    WHEN decQuantity < 0 
    THEN 'Consumed (Strips) can NOT be negetive' 
    WHEN decClosing < 0 
    THEN 'Closing (Strips) can NOT be negetive' 
    ELSE NULL 
    END 
1

正如我以前評論,你可以使用CASE表達做UPDATE可以隨時修改,硬編碼的CASE表達式不起作用。相反,你可以使用CROSS APPLY獲得varColumnName動態:

UPDATE d 
    SET varInvalidremarks = STUFF((
     SELECT 
      CASE WHEN d.decQuantity < 0 THEN ',' + c.decQuantity + ' cannot be negative' ELSE '' END + 
      CASE WHEN d.decClosing < 0 THEN ',' + c.decClosing +' cannot be negative' ELSE '' END 
     ),1, 1, '') 
FROM #Data d 
CROSS APPLY(
    SELECT 
     decQuantity = MAX(CASE WHEN varAliasName = 'decQuantity' THEN varColumnName END), 
     decClosing = MAX(CASE WHEN varAliasName = 'decClosing' THEN varColumnName END) 
    FROM #Config 
) c