我知道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
答案 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
感谢每一位人士的支持和帮助。并表现出兴趣。