[SQL]使用 sp_executesql 要注意的是?

同事使用 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';

image

 

同事使用 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'

image

 

眼尖的朋友應該就會發現什麼問題了吧~~

就是 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';

image

 

用個例子來測試一下 varchar 及 nvarchar 的預設長度,


DECLARE @c2 VARCHAR, @c3 NVARCHAR
SET @c2 = '1111111111111111111111'
SET @c3 = N'1111111111111111111111'
SELECT @c2 AS c2, @c3 AS c3;

image

所以使用上,使用預設值要小心哦! 才不會發生預料外的事哦…

 

參考資料

sp_executesql (Transact-SQL)

char 和 varchar (Transact-SQL)

nchar 和 nvarchar (Transact-SQL)

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^