用于在sql中执行循环

时间:2017-05-24 18:02:25

标签: sql-server tsql stored-procedures

我知道SQL不能为循环做,但我确实需要进行此查询,但找不到方法。我在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();
    }
}

我试图制作一个临时表而不是执行但没有工作。我收到一个错误:

  

字符串或二进制数据将被截断。

我试图编写的查询如下:

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

2 个答案:

答案 0 :(得分:1)

我假设您编写的SQL中的db.saveChanges()和INSERT语句表明您正在尝试将数据持久保存到数据库中。如果是这种情况,为什么你必须逐行循环?如果您必须根据情况进行INSERT或UPDATE,MERGE语句是否适合您?

答案 1 :(得分:0)

最后我自己创造了它......

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

感谢每一位人士的支持和帮助。并表现出兴趣。