1
我有下面的SQL語句(SQL服務器):轉換SQL語句 - 不需要光標和循環?
DECLARE @atr nvarchar(255), @con nvarchar(1000), @func nvarchar(5);
SET @con='example'
SET @func=(SELECT FNCELEM FROM CNDSC WHERE NAME LIKE @con)
DECLARE Atr_Cursor CURSOR FOR
SELECT ATRBT FROM CNEA WHERE (ELEMS LIKE '%'[email protected]+'%' AND NOT ELEMS LIKE '%1' + @func + '%');
OPEN Atr_Cursor;
FETCH NEXT FROM Atr_Cursor
INTO @atr;
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @SQLString nvarchar(500);
IF (SELECT COUNT(*) FROM CNEXTRA WHERE ATR LIKE ''[email protected]+'' AND NAME LIKE ''[email protected]+'')>0
BEGIN
SET @SQLString= N'SELECT NAME, ATR, CNVAL, INRDR FROM CNEXTRA WHERE ATR LIKE ''' + @atr + ''' AND NAME LIKE '''[email protected]+''';';
END
ELSE
BEGIN
SET @SQLString= N'SELECT '''[email protected]+''' AS NAME, '''[email protected]+''' AS ATR, '''' AS CNVAL, '''' AS INRDR';
END
EXEC (@SQLString);
FETCH NEXT FROM Atr_Cursor
INTO @atr;
END
CLOSE Atr_Cursor;
DEALLOCATE Atr_Cursor;
顯然,這個語句返回幾個結果,由於循環。當試圖用我的C#代碼使用這個語句時,我只能得到最後一個循環的結果(顯然也是如此)。所以我試圖將結果轉換成臨時表格;那工作。但是現在我遇到了一個問題,即我無法構建該聲明的「補充」,以便將結果寫回表格中。
如果可以更改查詢,以便沒有更多的循環,我認爲構建查詢的補充將會更容易。
所以實際上我的問題是:是否有機會改變語句,以便沒有更多的循環?這看起來怎麼樣?如果這是不可能的,我將如何構建該聲明的補充?
非常感謝您的幫助。
不幸的是,我得到一個錯誤... – oopbase 2012-01-15 13:22:02
我認爲所有在查詢中引用的列都是varchar類型的「轉換轉換爲varchar值‘%’爲數據類型int時失敗」。如果有任何不請,請告訴我。 – Gary 2012-01-15 13:42:50
如果是數字列,我已將CAST添加到CNDSC.FNCELEM。 – Gary 2012-01-15 13:48:21