मुझे यह जानने में दिलचस्पी है कि मेरे पास अब तक जो एक कर्सर का उपयोग करता है उससे बेहतर/अधिक इष्टतम समाधान है, जो मुझे पता है कि प्रदर्शन के अनुसार बहुत अच्छा नहीं है।

मूल रूप से मेरी आवश्यकता यह भी जांचती है कि किसी आईडी के लिए कई सेटिंग्स मौजूद हैं या नहीं और फिर उन्हें तदनुसार अपडेट या डालें।

ऐसा करने के लिए मेरे पास है:

DECLARE @UserId UNIQUEIDENTIFIER = '{PUT-GUID-HERE}'

मैं फिर एक टेबल वैरिएबल घोषित करता हूं जिसमें मैं सेटिंग नाम और मान जोड़ता हूं, इनमें से कुल मिलाकर लगभग 15 हैं।

DECLARE @SettingsToCheck TABLE (SettingName varchar(100), SettingValue varchar(100)
INSERT INTO @SettingsToCheck ('Setting1', 'Setting1 Value') --Repeat...

DECLARE @CurrentSettingName varchar(100)
DECLARE @CurrentSettingValue varchar(100)
DECLARE Settings_Cursor CURSOR FOR SELECT SettingName, SettingValue FROM @SettingsToCheck
OPEN Settings_Cursor

FETCH NEXT FROM Settings_Cursor INTO @CurrentSettingName, @CurrentSettingValue
WHILE @@FETCH_STATUS = 0
BEGIN
    IF EXISTS (SELECT * FROM MyActualTable WHERE UserID = @UserId AND SettingName = @CurrentSettingName)
    BEGIN
        UPDATE MyActualTable SET SettingValue = @CurrentSettingValue WHERE UserID = @UserId AND SettingName = @CurrentSettingName
    END
    ELSE
    BEGIN
        INSERT INTO MyActualTableVALUES (NEWID(), @UserId, GETDATE(), @CurrentSettingName, @CurrentSettingValue)
    END

    FETCH NEXT FROM Settings_Cursor INTO @CurrentSettingName, @CurrentSettingValue
END

CLOSE Settings_Cursor
DEALLOCATE Settings_Cursor

मुझे पता है कि यह सवाल राय के अधीन है, लेकिन मैं किसी भी विकल्प से अनजान हूं।

संपादित करें:

ऐसा परिदृश्य हो सकता है जहां कुछ/कोई नहीं या सभी सेटिंग्स पहले से मौजूद हों। लेकिन यहाँ एक उदाहरण है।

पहले:

SettingName  |  SettingValue
____________________________
Setting1     |  Setting1Value

बाद:

SettingName  |  SettingValue
____________________________
Setting1     |  Setting1ValueUPDATED

Setting2     |  NewSetting
0
Ryan Thomas 18 फरवरी 2020, 14:30
1
लूपिंग नहीं पहला कदम होगा; आप एसक्यूएल लिख रहे हैं सी # नहीं। सेट-आधारित विधियां लगभग हमेशा SQL में एक लूप का प्रदर्शन करेंगी (कुछ बहुत कम अवसर हैं जो सच नहीं हैं, इसलिए "सेट-आधारित लूप")। नमूना डेटा, और अपेक्षित परिणाम यहां बहुत मदद करेंगे।
 – 
Larnu
18 फरवरी 2020, 14:32
मैं सिर्फ 15 या तो सेटिंग्स के लिए IF EXISTS ब्लॉक दोहरा सकता था, लेकिन यह काफी अपठनीय हो जाएगा, लेकिन यदि आवश्यक हो तो बलिदान करने में खुशी होगी। कोड ठीक काम करता है इसलिए अपेक्षित परिणाम तालिका में केवल अद्यतन मान हैं।
 – 
Ryan Thomas
18 फरवरी 2020, 14:41
यकीन नहीं होता कि यह इसे और अधिक प्रदर्शनकारी बना देगा; मैं आपका डिज़ाइन नहीं देख सकता, लेकिन मुझे संदेह है कि आप इसे एक ही कथन में करने में सक्षम होंगे। नमूना डेटा और अपेक्षित परिणामों के बिना अधिक सुझाव देना असंभव है।
 – 
Larnu
18 फरवरी 2020, 14:43
मैंने अपने प्रश्न को उदाहरण के पहले/बाद में एक बहुत ही बुनियादी के साथ अद्यतन किया है। क्या यह मदद करता है?
 – 
Ryan Thomas
18 फरवरी 2020, 14:55

2 जवाब

आप नीचे के रूप में मर्ज का उपयोग कर सकते हैं

DECLARE @SettingsToCheck TABLE 
(
    SettingName varchar(100)
    ,SettingValue varchar(100)
)

DECLARE @ActualTable TABLE 
(
    SettingName varchar(100)
    ,SettingValue varchar(100)
)

INSERT INTO @SettingsToCheck 
VALUES
('Setting1', 'Setting1 Value') --Repeat...
,('Setting2', 'Setting2 Value') 
,('Setting3', 'Setting3 Value') 
,('Setting4', 'Setting45 Value') 
,('Setting5', 'Setting5 Value') 
,('Setting6', 'Setting6 Value') 
,('Setting7', 'Setting7 Value') 


INSERT INTO @ActualTable 
VALUES
 ('Setting4', 'Setting4 Value')

MERGE INTO @ActualTable  AS target
USING @SettingsToCheck AS source
    ON target.SettingName = source.SettingName
WHEN MATCHED THEN 
    UPDATE SET target.SettingValue = source.SettingValue
WHEN NOT MATCHED BY TARGET THEN
    INSERT (SettingName, SettingValue)
    VALUES (source.SettingName, source.SettingValue);

Select * from @ActualTable
1
Akash Patel 18 फरवरी 2020, 14:57
धन्यवाद, मैं आज दोपहर इसे आजमाऊंगा।
 – 
Ryan Thomas
18 फरवरी 2020, 15:13
मैंने रिकॉर्ड की पहचान के लिए सेटिंगनाम का उपयोग किया है। आप उस स्थिति में UserId जोड़ सकते हैं। मुझे किसी भी प्रतिक्रिया के बारे में बताएं ...
 – 
Akash Patel
18 फरवरी 2020, 16:28

मैं जानता हूं कि लोग MERGE का उपयोग करना पसंद करते हैं, लेकिन मैं उन्हें केवल उनके व्यक्तिगत कार्य के लिए अलग करना पसंद करता हूं। एरोन बर्ट्रेंड ने यहां MERGE के साथ कुछ मुद्दों का दस्तावेजीकरण किया: https://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/, लेकिन मुझे यकीन नहीं है कि उनमें से कितने अभी भी कायम हैं।

वैसे भी, यह एक विकल्प है:

CREATE TABLE #SettingsToCheck 
(
    SettingName varchar(100)
    ,SettingValue varchar(100)
)


CREATE TABLE #ActualTable 
(
    SettingName varchar(100)
    ,SettingValue varchar(100)
)

INSERT INTO #SettingsToCheck 
VALUES
('Setting1', 'Setting1 Value') --Repeat...
,('Setting2', 'Setting2 Value') 
,('Setting3', 'Setting3 Value') 
,('Setting4', 'Setting45 Value') 
,('Setting5', 'Setting5 Value') 
,('Setting6', 'Setting6 Value') 
,('Setting7', 'Setting7 Value') 


INSERT INTO #ActualTable 
VALUES
 ('Setting4', 'Setting4 Value')


 UPDATE #ActualTable 
    SET SettingValue = t2.SettingValue
    FROM #ActualTable t1
    INNER JOIN #SettingsToCheck t2 on t1.SettingName = t2.SettingName

INSERT INTO #ActualTable(SettingName,SettingValue)
SELECT t1.SettingName,t1.SettingValue   
    FROM #SettingsToCheck t1
    LEFT JOIN #ActualTable t2 on t1.SettingName = t2.SettingName
    WHERE t2.SettingName IS NULL

select * from #ActualTable
0
JMabee 18 फरवरी 2020, 16:05