pour l'exécution de la boucle en sql

Je sais que SQL ne peut pas faire pour la boucle, mais j'ai vraiment besoin de faire cette requête, mais ne peux pas find un moyen. J'ai le code suivant à faire en 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 (ssortingng.IsNullOrEmpty(item.LocalLabelValue)) { item.LabelValue = allItems.FirstOrDefault(x => x.LabelValue == item.LabelValue && !ssortingng.IsNullOrEmpty(x.LocalLabelValue)).LocalLabelValue; db.saveChanges(); } } 

J'ai essayé de faire une table de temp et d'exécuter mais n'a pas fonctionné. J'ai une erreur

Chaîne ou des données binarys seront tronquées.

La requête que j'ai essayé d'écrire est juste comme ci-dessous:

 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 

Je suppose que db.saveChanges () et l'instruction INSERT dans le SQL que vous avez écrit indiquent que vous essayez de conserver datatables dans la database. Si c'est le cas, pourquoi devez-vous le faire ligne par ligne avec une boucle? Une instruction MERGE fonctionnerait-elle pour vous si vous devez INSERT ou UPDATE selon la situation?

Enfin, je l'ai créé moi-même ….

 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 

Merci à tous pour votre soutien et votre aide. et montrant de l'intérêt.