這是問題原型:
--SQL1 declare @OrderDetailID nvarchar(50) set @OrderDetailID='R1502003963580C001' select * from BillDetail where OrderDetailID=@OrderDetailID --SQL2 select * from BillDetail where OrderDetailID='R1502003963580C001'
PS:另外在每次使用SqlParameter時,如果是字符類型的,都盡量加上size,涉及到執行計劃緩存的問題
例如:new
SqlParameter(
"@name"
, SqlDbType.Varchar, 40) { Value = name };
反正還是不能下班。。。
我又查了一下:好像微軟官方也出現過這樣的問題
給出的解決方案是這樣的:The only resolution to this problem is to use a stored querydef query instead of prepared queries.
也許可以這麼理解(用存儲過程的形式):
將上面的參數化改為這樣: exec('select * from BillDetail where OrderDetailID='''+@OrderDetailID+'''')
暫且就這樣吧!主要是現在不能重現,無法驗證,如果遇到了,這樣先試一下咯
是由於定義的字符串類型不匹配造成的
declare @OrderDetailID varchar(50) --從nvarchar變為varchar
著急查出問題的朋友直接看下面就好了。。。
總結一下:
執行速度較慢的這句執行計劃如下:
declare @OrderDetailID nvarchar(50)
set @OrderDetailID='R1502003963580C001'
select * from BillDetail where OrderDetailID=@OrderDetailID
解決辦法有兩種:
1.使用執行存儲過程的方式
declare @OrderDetailID1 nvarchar(20)
set @OrderDetailID1='R1502003963580C001'
exec('select * from BillDetail where OrderDetailID='''+@OrderDetailID1+'''')
2.定義正確的參數類型
declare @OrderDetailID2varchar(20)
set @OrderDetailID1='R1502003963580C001'
select * from BillDetail where OrderDetailID=@OrderDetailID2