2016-05-26 11 views
6

मैं अपने एसक्यूएल सर्वरअद्यतन एक तालिका स्तंभ मान

टेबल नहीं में दो तालिकाओं की है। 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

इसे केवल 'केस' अभिव्यक्ति के साथ क्यों न करें? –

+1

'चयन \t decQuantity, \t decClosing, \t varInvalidremarks = STUFF (( \t \t चयन \t \t \t मामला है जब decQuantity <0 तो अन्य सभी '', खपत (स्ट्रिप्स) नकारात्मक नहीं हो सकता '' अंत + \t \t \t मामला है जब ', बंद (स्ट्रिप्स) नकारात्मक नहीं हो सकता' <0 तब decClosing अन्य सभी '' अंत \t \t), 1, 1, '') #Data से ' –

उत्तर

3

इस एक गतिशील एसक्यूएल समाधान है। गतिशील क्वेरी

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

कुछ इस तरह काम करना चाहिए:

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, '') 

हालांकि, अगर #config.varColumnName:

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 अभिव्यक्ति काम नहीं करेगी। इसके बजाय, आप varColumnName गतिशील पाने के लिए CROSS APPLY उपयोग कर सकते हैं:

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 
संबंधित मुद्दे