同事使用 sp_executesql 卻查不出預期中的資料?
同事在SSMS中使用 sp_executesql 執行SQL,給了參數及參數值去執行,卻沒有回傳任何資料。
但是如果直接執行 SQL 的話,是有資料的說。以下用範例程式來說明,
--drop table T1
CREATE TABLE T1
(
c1 INT,
c2 VARCHAR(30),
c3 NVARCHAR(30)
);
INSERT INTO dbo.T1( c1, c2, c3 )
VALUES
( 0, '00000000000000000000000', N'00000000000000000000000')
,( 1, '1111111111111111111111', N'1111111111111111111111');
SELECT * FROM dbo.T1
WHERE c1 = 1 AND c2 = '1111111111111111111111'
AND c3 = N'1111111111111111111111';
同事使用 sp_executesql 執行,如下,
DECLARE @sql nVARCHAR(max);
SET @sql = 'SELECT * FROM dbo.T1 WHERE c1=@c1 and c2 = @c2 AND c3 = @c3;';
EXECUTE sp_executesql @sql
, N'@c1 int, @c2 varchar, @c3 nvarchar'
,1, '1111111111111111111111', N'1111111111111111111111'
眼尖的朋友應該就會發現什麼問題了吧~~
就是 sp_executesql 的參數定義中,varchar 及 nvarchar 沒有設定長度。
所以那就會變成了 varchar(1) 及 nvarchar(1),所以自然就找不到任何的資料哦!
所以如果設定長度就可以正確的Search到哦!
DECLARE @sql nVARCHAR(max);
SET @sql = 'SELECT * FROM dbo.T1 WHERE c1=@c1 and c2 = @c2 AND c3 = @c3;';
EXECUTE sp_executesql @sql
, N'@c1 int, @c2 varchar(30), @c3 nvarchar(30)'
,1, '1111111111111111111111', N'1111111111111111111111';
用個例子來測試一下 varchar 及 nvarchar 的預設長度,
DECLARE @c2 VARCHAR, @c3 NVARCHAR
SET @c2 = '1111111111111111111111'
SET @c3 = N'1111111111111111111111'
SELECT @c2 AS c2, @c3 AS c3;
所以使用上,使用預設值要小心哦! 才不會發生預料外的事哦…
參考資料
nchar 和 nvarchar (Transact-SQL)
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^