2 回答

TA貢獻1829條經(jīng)驗 獲得超7個贊
1. 組裝的SQL語句錯了:你的語句中將字符串類型跟表類型加到一起了。 2. 表變量的使用方式錯誤:作用域的問題。 3. 表變量的使用方式不正確:表變量存儲方式的問題。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 你的這個SQL語句并沒有涉及表變量的其他問題,因此這里就以上幾個問題來修正你的代碼。 僅修正問題1、2: declare @tb table(byer ntext not null,fare money not null) ------> create table #tb (byer ntext not null,fare money not null) exec (N'insert '+@tb+''+@sqlone) ------> exec (N'insert '+'#tb '+@sqlone) 后面相應的@tb全部改為#tb,即可 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 上面的寫法有不少的性能問題,不管是SQL語句本身還是整個方案,包括我上面給出的修改方案。所以,現(xiàn)在考慮修正第3個問題 下面給出一個稍微好一些的寫法(注意,方案本身的缺陷只能根據(jù)你的實際業(yè)務來解決了)整個存儲過程可以修改為以下形式: EXEC (N'SELECT SUM(dbo.f_split(byer,'','')) AS number, SUM(fare) AS Totmoney FROM (' + @sqlone + ') AS A') 里面的byer和fare需要你自己再調整,那就看你傳入的SQL語句中的字段命名是怎么樣的了。 這樣修改之后,能夠避免一些不必要的性能損失。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 最后補充一點:修改后的方案雖然會比之前的好一些,不過整體方案仍然不是很合理,而且這樣的存儲過程還會降低應用程序的可維護性。建議在今后的設計中盡量不要使用這樣的方案。

TA貢獻1757條經(jīng)驗 獲得超7個贊
你這種方式定義的@tb是一個表變量,當使用EXEC(@sql)后,@tb表變量就被自動銷毀,無法再被訪問了。 如果希望在EXEC(@sql)之后能繼續(xù)被訪問,可以采用創(chuàng)建局部臨時表(#)的方式。
- 2 回答
- 0 關注
- 623 瀏覽
添加回答
舉報