iT邦幫忙

0

sql cursor 問題

  • 分享至 

  • twitterImage
DECLARE @VSQL   VARCHAR(8000);
  DECLARE @VSQL1   VARCHAR(8000);
  DECLARE @VSQL2   VARCHAR(8000);
  DECLARE @ID01   NCHAR(04);
  DECLARE @TI001  NCHAR(10);
  DECLARE @VTOT   DECIMAL(15,6);

  DECLARE C1 CURSOR FOR SELECT TI001,MB001,TOT FROM EIS04C
  OPEN C1;
  FETCH NEXT FROM C1 INTO @TI001,@ID01,@VTOT
  WHILE @@FETCH_STATUS = 0
  BEGIN
  
    SET @VSQL='';
   
  --SET @VSQL=@VSQL+'UPDATE EIS04ALL1 SET V'+SUBSTRING(@ID01,2,3)+'=V'+SUBSTRING(@ID01,2,3)+'+'+CAST(@VTOT AS VARCHAR(21))+' WHERE   RTRIM(TI001)='+char(39)+RTRIM(@TI001)+char(39);


    SET @VSQL ='V'
   
    SET @VSQL1 =@VSQL+SUBSTRING(@ID01,2,3)+'+'+CAST(@VTOT AS VARCHAR(21));
   
    SET @VSQL2 =@VSQL+SUBSTRING(@ID01,2,3);
     
     UPDATE EIS04ALL1 SET @VSQL2 = @VSQL1
    WHERE RTRIM(TI001)=+char(39)+RTRIM(@TI001)+char(39);
     
    --EXEC (@VSQL2);
PRINT @VSQL2;
    FETCH NEXT FROM C1 INTO @TI001,@ID01,@VTOT
  END;
  CLOSE C1;
  DEALLOCATE C1;

※小弟的用意是在透過curosr把EIS04ALL1這個table裡面的值更新。
小弟目前在練習使用cursor遇到一些問題,就是黃色字體的那段code,語法無問題,在跑store procedure結果會出來,但會出現無效的資料型"V",
但如果使用紅色字體的那段code,不會出現無效的資料型"V",但EIS04ALL1這個table資料並沒有更新資料,不知黃色字體或紅色字體哪邊出了問題。

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

8
賽門
iT邦超人 1 級 ‧ 2013-07-03 23:16:37
最佳解答

因為不知道資料庫的內容, 所以只能儘量猜一猜.

首先, 不要用CHAR(39), 也就是...

<pre class="c" name="code">+char(39)+RTRIM(@TI001)+char(39)

改成

<pre class="c" name="code">'''+RTRIM(@TI001)+'''

不知道@VTOT的內容值是不是帶小數數值, 如果是這樣, 不要用...

<pre class="c" name="code">CAST(@VTOT AS VARCHAR(21))

改用

<pre class="c" name="code">LTRIM(STR(@VTOT))

建議你這樣改寫:

<pre class="c" name="code">SET @VSQL='UPDATE EIS04ALL1 ' + 
          '   SET V'+SUBSTRING(@ID01,2,3)+
          '      =V'+SUBSTRING(@ID01,2,3)+'+'+LTRIM(STR(@VTOT))+
          ' WHERE RTRIM(TI001)='+'''+RTRIM(@TI001)+''';

但, 之所以會出現無效資料型別"V"的錯誤訊息, 應該是SUBSTRING(@ID01,2,3)傳回空值, 導致SET V = V + @VTOT, 但V不是數值, 不欄位也無型別, 所以就出錯誤.

建議你把Cursor中的SELECT改一下...

<pre class="c" name="code">SELECT TOP 1 TI001,MB001,TOT FROM EIS04C

先抓第一筆資料來研究一下內容對不對, 然後再把@VSQL字串內容(UPDATE指令)直接放在SQL查詢視窗中執行看看, 這樣就會知道問題在那裏, 以及如何更正錯誤.

看更多先前的回應...收起先前的回應...
rt788 iT邦新手 5 級 ‧ 2013-07-04 12:01:22 檢舉

大大我是要組成像這樣的東西

rt788 iT邦新手 5 級 ‧ 2013-07-04 12:01:59 檢舉

rt788 iT邦新手 5 級 ‧ 2013-07-04 12:05:45 檢舉

SELECT * TI001,MB001,TOT FROM EIS04C
表內容如下:

我試著用你的建議的程式:

<pre class="c" name="code">    SET @VSQL='UPDATE EIS04ALL1 ' +   
              '   SET V'+SUBSTRING(@ID01,2,3)+  
              '      =V'+SUBSTRING(@ID01,2,3)+'+'+LTRIM(STR(@VTOT))+  
              ' WHERE RTRIM(TI001)='+'''+RTRIM(@TI001)+''';  

執行sp時,還是會出現無效的資料型態"v"
不知是哪邊有錯?

外獅佬 iT邦大師 1 級 ‧ 2013-07-04 12:30:08 檢舉

養成好習慣....欄位、資料表明稱,請用[]標註....

<pre class="c" name="code">
SET @VSQL='UPDATE [EIS04ALL1] ' +     
          '   SET [V'+SUBSTRING(@ID01,2,3)+    
          '      ]=[V'+SUBSTRING(@ID01,2,3)+']+'+LTRIM(STR(@VTOT))+    
          ' WHERE RTRIM([TI001])='+'''+RTRIM(@TI001)+''';
rt788 iT邦新手 5 級 ‧ 2013-07-04 13:25:55 檢舉

感謝wiselou你的提醒,我現在卡在'+'''+RTRIM(@TI001)+'''
出來的值不是帶進去的值,不知怎麼改?

外獅佬 iT邦大師 1 級 ‧ 2013-07-04 13:42:28 檢舉

rt788提到:
出來的值不是帶進去的值

疑惑....這是什麼意思??疑惑

<pre class="c" name="code">
$i = "我是老鷹";
echo $i;
//我是獅子

這這種問題嗎??疑惑

rt788 iT邦新手 5 級 ‧ 2013-07-04 13:48:25 檢舉

WHERE RTRIM(TI001)='LA0013'
就是'LA0013'這個值,他會因為@TI001,帶入什麼值,就會變動。

外獅佬 iT邦大師 1 級 ‧ 2013-07-04 13:53:31 檢舉

汗...不懂...剛剛仔細看了上面的資料...全部都是LA0013...Orz
要不要把code post上來研究一下啊...疑惑

ted99tw iT邦高手 1 級 ‧ 2013-07-04 14:06:49 檢舉

可以po食譜嗎...偷笑

rt788 iT邦新手 5 級 ‧ 2013-07-04 14:43:30 檢舉


大大是where後面的值。

rt788 iT邦新手 5 級 ‧ 2013-07-04 14:46:27 檢舉

就是simon581923大大建議把 +char(39)+RTRIM(@TI001)+char(39) 改成
'''+RTRIM(@TI001)+''' 時,結果並不一樣,但我要出現的值是@TI001帶入的值
會跟著改變。

外獅佬 iT邦大師 1 級 ‧ 2013-07-04 14:48:59 檢舉

暈有看沒有懂...暈

總裁 iT邦好手 1 級 ‧ 2013-07-04 14:52:07 檢舉

WHERE RTRIM([TI001])='+'''+RTRIM(@TI001)

你的意思是[TI001]這一串字會變成LAxxxx嗎??疑惑

rt788 iT邦新手 5 級 ‧ 2013-07-04 15:05:14 檢舉


這個table裡面有TI001,我只是透過cursor變成用@TI001帶入,他會一筆一筆塞進去。
update set where的語法,我是為了組這個語法。

賽門 iT邦超人 1 級 ‧ 2013-07-04 18:26:15 檢舉

就語法來說, UPDATE命令字串是完全正確的.
現在, 要講請您把EIS04ALL1資料表的欄位名稱和資料內容PO出來看一看.
我想, 您的問題可能不是語法問題, 而是邏輯問題.
不如這樣, 您把解決的實際問題也PO一PO, 這樣我們會比較清楚程式碼是要處理什麼問題..暈

rt788 iT邦新手 5 級 ‧ 2013-07-04 23:08:31 檢舉

後來我找到問題了,EIS04C的MB001欄位有空值,才會出錯,已排除問題,謝謝大家,
但我還是把EIS04ALL1資料表的欄位貼給大家看,我去組update語法,是為了更新這個table
裡面的欄位。

我要發表回答

立即登入回答