トップ回答者
sp_executesql使用時の照合順序

質問
-
いつもお世話になっております。サヴロウと申します。
sp_executesqlでの照合順序について質問致します。
[環境]
データベース : 2008SP1 10.0.2531.0 X86 Build 7600
インスタンスの照合順序 : Japanese_XJIS_100_CI_AS
テストデータベース(名称:test1)の照合順序 : Japanese_XJIS_100_CI_AS[テストテーブル]
CREATE TABLE Master1(
Code nvarchar(20) NOT NULL,
Contents nvarchar(1000),
CONSTRAINT [PK_Master1] PRIMARY KEY (Code))[テストデータ]
insert into Master1
values
('a','aです'),
('b','bです'),
・・・(中略)
('z','zです')select * from master1 where code like 's%'
をmanegementstudioで実行すると
Code Contents
---- --------
s sですと帰ってきますが(もちろんa~zすべて)
exec sp_executesql N'select * from master1 where code like @Code',N'@Code nvarchar(2)',@Code='s%'
とすると"s"のみ検索がヒットしません。
照合順序の問題と思いまして
exec sp_executesql N'select * from master1 where code like @Code collate japanese_CI_AS',N'@Code nvarchar(2)',@Code='s%'
とcollateをつけるとヒットします。
なぜこのような現象になるのかどなたかお分かりでしょうか?※sp_executesqlを使わなければいいのですが、
ADO.NETで検索を行うと自動的にsp_executesqlに変換されてしまいます。[ソースのサンプル(VB.NET)]
Using conn As SqlConnection = New SqlConnection("Data Source=(local);Initial Catalog=test1;Integrated Security=True")
conn.Open()
Dim sql As String = "select Contents from master1 where code like @Code"
Dim cmd As New SqlCommand(sql, conn)
cmd.Parameters.AddWithValue("@Code", TextBox1.Text & "%")
MessageBox.Show(cmd.ExecuteScalar)
End Using過去のトピックも検索しましたが、T-SQLとsp_executesqlの結果が違うというものはなかったので質問させて頂きました。
よろしくお願いいたします。