2012-01-15 42 views
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#代碼使用這個語句時,我只能得到最後一個循環的結果(顯然也是如此)。所以我試圖將結果轉換成臨時表格;那工作。但是現在我遇到了一個問題,即我無法構建該聲明的「補充」,以便將結果寫回表格中。

如果可以更改查詢,以便沒有更多的循環,我認爲構建查詢的補充將會更容易。

所以實際上我的問題是:是否有機會改變語句,以便沒有更多的循環?這看起來怎麼樣?如果這是不可能的,我將如何構建該聲明的補充?

非常感謝您的幫助。

回答

2

我認爲這個查詢會做到這一點。

SELECT 
    CNDSC.NAME, 
    CNEA.ATRBT AS ATR, 
    ISNULL(CNEXTRA.CNVAL,'') AS CNVAL, 
    ISNULL(CNEXTRA.INRDR,'') AS INRDR 
FROM 
    CNDSC 
    INNER JOIN CNEA 
     ON CNEA.ELEMS LIKE '%'+CAST(CNDSC.FNCELEM AS VARCHAR)+'%' AND 
      NOT CNEA.ELEMS LIKE '%1'+CAST(CNDSC.FNCELEM AS VARCHAR)+'%' 
    LEFT OUTER JOIN CNEXTRA 
     ON CNEXTRA.ATR LIKE CNEA.ATRBT AND 
      CNEXTRA.NAME LIKE @con 
WHERE 
    CNDSC.NAME LIKE @con; 

我使用了這個模式。請讓我知道哪些列是錯誤的。

CREATE TABLE CNDSC 
    (NAME VARCHAR(100), FNCELEM VARCHAR(100)); 
INSERT INTO CNDSC VALUES ('ONE','FUNC1'); 
INSERT INTO CNDSC VALUES ('TWO','FUNC2'); 

CREATE TABLE CNEA 
    (ATRBT VARCHAR (100), ELEMS VARCHAR(100)); 
INSERT INTO CNEA VALUES ('ATTRIBUTE1','FUNC1'); 
INSERT INTO CNEA VALUES ('ATTRIBUTE2','FUNC2'); 

CREATE TABLE CNEXTRA 
    (ATR VARCHAR(100), 
    NAME VARCHAR(100), 
    CNVAL VARCHAR(100), 
    INRDR VARCHAR(100)); 
INSERT INTO CNEXTRA VALUES ('ATTRIBUTE1','ONE','CNVAL','INRDR'); 
+0

不幸的是,我得到一個錯誤... – oopbase 2012-01-15 13:22:02

+0

我認爲所有在查詢中引用的列都是varchar類型的「轉換轉換爲varchar值‘%’爲數據類型int時失敗」。如果有任何不請,請告訴我。 – Gary 2012-01-15 13:42:50

+0

如果是數字列,我已將CAST添加到CNDSC.FNCELEM。 – Gary 2012-01-15 13:48:21