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資料並沒有更新資料,不知黃色字體或紅色字體哪邊出了問題。
因為不知道資料庫的內容, 所以只能儘量猜一猜.
首先, 不要用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查詢視窗中執行看看, 這樣就會知道問題在那裏, 以及如何更正錯誤.
大大我是要組成像這樣的東西
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"
不知是哪邊有錯?
養成好習慣....欄位、資料表明稱,請用[]標註....
<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)+''';
感謝wiselou你的提醒,我現在卡在'+'''+RTRIM(@TI001)+'''
出來的值不是帶進去的值,不知怎麼改?
rt788提到:
出來的值不是帶進去的值
....這是什麼意思??
<pre class="c" name="code">
$i = "我是老鷹";
echo $i;
//我是獅子
這這種問題嗎??
WHERE RTRIM(TI001)='LA0013'
就是'LA0013'這個值,他會因為@TI001,帶入什麼值,就會變動。
...不懂...剛剛仔細看了上面的資料...全部都是LA0013...
要不要把code post上來研究一下啊...
可以po食譜嗎...
大大是where後面的值。
就是simon581923大大建議把 +char(39)+RTRIM(@TI001)+char(39) 改成
'''+RTRIM(@TI001)+''' 時,結果並不一樣,但我要出現的值是@TI001帶入的值
會跟著改變。
有看沒有懂...
WHERE RTRIM([TI001])='+'''+RTRIM(@TI001)
你的意思是[TI001]這一串字會變成LAxxxx嗎??
這個table裡面有TI001,我只是透過cursor變成用@TI001帶入,他會一筆一筆塞進去。
update set where的語法,我是為了組這個語法。
就語法來說, UPDATE命令字串是完全正確的.
現在, 要講請您把EIS04ALL1資料表的欄位名稱和資料內容PO出來看一看.
我想, 您的問題可能不是語法問題, 而是邏輯問題.
不如這樣, 您把解決的實際問題也PO一PO, 這樣我們會比較清楚程式碼是要處理什麼問題..
後來我找到問題了,EIS04C的MB001欄位有空值,才會出錯,已排除問題,謝謝大家,
但我還是把EIS04ALL1資料表的欄位貼給大家看,我去組update語法,是為了更新這個table
裡面的欄位。