2017-05-24 1 views
1

Ich weiß, SQL kann nicht für Schleife, aber ich muss wirklich diese Abfrage machen, kann aber keinen Weg finden. Ich habe folgenden Code in SQL zu machen.für die Ausführung der Schleife in SQL

List<MergerDic> allItems = (from row in dmVM 
          join t2 in mainDic on row.labelID equals t2.LabelId 
          where row.LanguageID == 20 
          orderby row.LabelValue 
          select new MergerDic 
             { 
              LabelId = row.labelID, 
              LabelKey = t2.LabelKey, 
              LanguageID = row.LanguageID, 
              LabelValue = t2.LabelValue, 
              LocalLabelValue = row.LabelValue 
             }).ToList(); 

foreach (var item in allItems) 
{ 
    if (string.IsNullOrEmpty(item.LocalLabelValue)) 
    { 
     item.LabelValue = allItems.FirstOrDefault(x => x.LabelValue == item.LabelValue && 
       !string.IsNullOrEmpty(x.LocalLabelValue)).LocalLabelValue; 
     db.saveChanges(); 
    } 
} 

Ich habe versucht, eine temporäre Tabelle zu erstellen und dann ausgeführt, aber nicht funktioniert. Ich erhalte eine Fehlermeldung:

String or binary data would be truncated.

Die Abfrage, die ich nur zu schreiben versucht, so viel ist wie folgt:

DROP TABLE #Temp 

CREATE TABLE #Temp 
(
    LabelId nvarchar(max), 
    LabelValue nvarchar(max), 
    LabelKey nvarchar(max), 
    LanguageID int, 
    LocalLabelValue nvarchar 
) 

INSERT INTO #Temp 
    SELECT 
     dl.LabelID, dl.LabelValue, LabelKey, 20, dx.LabelValue 
    FROM 
     DictionaryLocalized dx 
    JOIN 
     Dictionary dl ON dl.LabelID = dx.LabelID 
    WHERE 
     LanguageID = 20 
    ORDER BY 
     dl.LabelValue 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    --Do something with Id here 
    PRINT 1 
    FETCH NEXT FROM #Temp 
END 
+0

Haben Sie vergessen, '' MAX ''nach' LocalLabelValue' in Ihrer 'CREATE TABLE' Anweisung hinzuzufügen? – BJones

+0

Nein, es wird einfach nicht benötigt –

+0

Watch meine C# -Code .... Ich muss SQL Query machen, um dieses Stück zu ersetzen –

Antwort

1

Ich gehe davon aus, dass db.saveChanges() und die INSERT-Anweisung in der SQL Sie geschrieben haben, zeigt an, dass Sie versuchen, Daten in der Datenbank zu speichern. Wenn das der Fall ist, warum musst du es Zeile für Zeile mit einer Schleife machen? Würde eine MERGE-Anweisung für Sie funktionieren, wenn Sie abhängig von der Situation EINFÜGEN oder AKTUALISIEREN müssen?

+0

ja, aber es gibt eine if-Bedingung in C# -Code ... Sie können sehen –

+0

Was Sie mit der IF in C# überprüfen, können Sie mit einer WHERE-Klausel konditionieren. – jdobrzen

0

Schließlich erstellt ich es auf meine eigene ....

BEGIN TRANSACTION 
    BEGIN 
    DECLARE @cntVar int = 0 
    DECLARE @cntVarMax int = 0 

    CREATE TABLE #Temp (
     REV_SEQ int IDENTITY (1, 1) PRIMARY KEY, 
     LabelId nvarchar(max), 
     LabelValue nvarchar(max), 
     LabelKey nvarchar(max), 
     LanguageID int, 
     LocalLabelValue nvarchar(max) 
    ) 

    INSERT INTO #Temp (LabelId, LabelValue, LabelKey, LanguageID, LocalLabelValue) 
     SELECT 
     row.LabelID AS LabelId, 
     [t2].LabelValue AS LabelValue, 
     t2.LabelKey AS LabelKey, 
     20 AS LanguageID, 
     row.LabelValue AS LocalLabelValue 
     FROM dbo.DictionaryLocalized row 
     JOIN dbo.Dictionary t2 
     ON row.LabelID = t2.LabelID 
     WHERE [row].LanguageID = 20 
     AND (row.LabelValue = '' 
     OR [row].LabelValue IS NULL) 
     ORDER BY [t2].LabelValue 


    SELECT 
     @cntVarMax = COUNT(*) 
    FROM #Temp 

    WHILE @cntVar <= @cntVarMax 
    BEGIN 
     PRINT @cntVar 
     --DECLARE @LabelData nvarchar(max) 
     DECLARE @LabelID nvarchar(max) 
     DECLARE @LabelVal nvarchar(max) 

    --SELECT @LabelData = t.LocalLabelValue 
    --FROM #Temp t WHERE t.REV_SEQ = @cntVar 
    --IF @LabelData = '' OR @LabelData IS NULL 
    BEGIN 
     SELECT 
     @LabelVal = t.LabelValue 
     FROM #Temp t 
     WHERE t.REV_SEQ = @cntVar 
     SELECT 
     @LabelID = t.LabelKey 
     FROM #Temp t 
     WHERE t.REV_SEQ = @cntVar 

     DECLARE @cnt1 int = 0 

     SELECT 
     @cnt1 = COUNT(dx.LabelValue) 
     FROM DictionaryLocalized dx 
     JOIN dbo.Dictionary t2 
     ON dx.LabelID = t2.LabelID 
     WHERE dx.LanguageID = 20 
     AND t2.LabelValue = @LabelVal 
     AND dx.LabelValue != '' 
     AND dx.LabelValue IS NOT NULL 

     IF @cnt1 > 0 
     BEGIN 
     UPDATE  dbo.DictionaryLocalized SET dbo.DictionaryLocalized.LabelValue = 
     (SELECT TOP 1 
      dx.LabelValue AS newvalue 
     FROM DictionaryLocalized dx 
     JOIN dbo.Dictionary t2 
      ON dx.LabelID = t2.LabelID 
     WHERE dx.LanguageID = 20 
     AND t2.LabelValue = @LabelVal 
     AND dx.LabelValue != '' 
     AND dx.LabelValue IS NOT NULL) 
     --SELECT ----------- remove this to updatd 
      --dll.LabelID, 
      --dll.LabelValue AS OldVal 
     FROM DictionaryLocalized dll 
     JOIN dbo.Dictionary t2 
      ON dll.LabelID = t2.LabelID 
     WHERE dll.LanguageID = 20 
     AND t2.LabelValue = @LabelVal 
     AND (dll.LabelValue = '' 
     OR dll.LabelValue IS NULL) 
     END 
    END 
     SELECT 
     @cntVar = @cntVar + 1 
    END 

    DROP TABLE #Temp 
    END 
    ROLLBACK TRANSACTION 

Dank ein jeder für Unterstützung und Hilfe. und zeigt Interesse.

Verwandte Themen