- PR -

連結したSQL文が実行できない。

投稿者投稿内容
hana
ベテラン
会議室デビュー日: 2003/02/08
投稿数: 70
投稿日時: 2005-04-22 14:29
WindowsXP SP2
MSSQLServer2000

こんにちは。
ただ今、このSQL文が実行できなく悩んでいます。

※SQL Server 2000のNorthwindサンプルデータベースを使用しています。

<成功>
declare @CustomerID nvarchar(5)
set @CustomerID = 'ALFKI'

select CompanyName from Customers where CustomerID = @CustomerID

結果:CompanyName = "Alfreds Futterkiste"

上記例では成功するのですが、

<失敗>
declare @str_sql varchar(100)
declare @CustomerID nvarchar(5)
set @CustomerID = 'ALFKI'

set @str_sql = 'select CompanyName from Customers where CustomerID = ' + @CustomerID

exec (@str_sql)

上記例では失敗してしまいます。

これは例として短くしていますが、
実際は絞り込み条件が動的に変化するので、
このようにSQL文を連結して実行させなければなりません。

どなたかご教授お願いします。


[ メッセージ編集済み 編集者: hana 編集日時 2005-04-22 14:30 ]
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-04-22 14:36
引用:

hanaさんの書き込み (2005-04-22 14:29) より:
set @str_sql = 'select CompanyName from Customers where CustomerID = ' + @CustomerID



で出来るSQL文って
「select CompanyName from Customers where CustomerID = ALFKI」
ってなりませんか?
CustomerIDが文字列ならば、ALFKIを''で囲まないとSQLエラーになると思います。
hana
ベテラン
会議室デビュー日: 2003/02/08
投稿数: 70
投稿日時: 2005-04-22 14:44
夏椰さん返信ありがとうございます。

引用:

夏椰さんの書き込み (2005-04-22 14:36) より:
引用:

hanaさんの書き込み (2005-04-22 14:29) より:
set @str_sql = 'select CompanyName from Customers where CustomerID = ' + @CustomerID


で出来るSQL文って
「select CompanyName from Customers where CustomerID = ALFKI」
ってなりませんか?
CustomerIDが文字列ならば、ALFKIを''で囲まないとSQLエラーになると思います。




set @CustomerID = 'ALFKI'としているので、
''付きで代入されていると思うのですが。。。

ちなみにエラーメッセージは
「列名 'ALFKI' は無効です。」と表示されます。
hana
ベテラン
会議室デビュー日: 2003/02/08
投稿数: 70
投稿日時: 2005-04-22 14:47
引用:

CustomerIDが文字列ならば、ALFKIを''で囲まないとSQLエラーになると思います。



以下のようなSQL文にしてみましたが、
データがあるにも関わらず、検索結果は0件でした。

set @str_sql = 'select CompanyName from Customers where CustomerID ='' + @CustomerID + '''
NAO
ぬし
会議室デビュー日: 2001/10/24
投稿数: 1256
お住まい・勤務地: 神奈川のはずれから東京の下町
投稿日時: 2005-04-22 15:08
今日は。

ちょっと実験してみました。

declare @CustomerID nvarchar(5)
declare @Test nvarchar(100)
declare @Test1 nvarchar(100)
set @CustomerID = 'ALFKI'
set @Test ='select CompanyName from Customers where CustomerID ='
set @Test1= @Test+ @CustomerID
Print @CustomerID
Print @Test
Print @Test1

とやって一応入っている物を表示させると

ALFKI
select CompanyName from Customers where CustomerID =
select CompanyName from Customers where CustomerID =ALFKI

となります。

なので

引用:

「列名 'ALFKI' は無効です。」と表示されます。



つまり
@CustomerIDが文字列として入ってないって事ですね

本来
select CompanyName from Customers where CustomerID ='ALFKI'

という文字列にならなければいけない訳です。

だからエラーになる訳で

@CustomerIDに'ALFKI'という文字列を入れなければいけない訳ですね。

※で、'ってどうやって文字列として入れるんだったっけ(^^ゞ

_________________
Inspired Ambitious
ISMS Assistant Auditor
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-04-22 15:25
引用:

NAOさんの書き込み (2005-04-22 15:08) より:
@CustomerIDに'ALFKI'という文字列を入れなければいけない訳ですね。

※で、'ってどうやって文字列として入れるんだったっけ(^^ゞ


set @CustomerID = '''ALFKI'''
でいれれました(^^)
#サイズを増やすのを忘れて引っかかってましたあほな自分(^^;
hana
ベテラン
会議室デビュー日: 2003/02/08
投稿数: 70
投稿日時: 2005-04-22 15:26
NAOさん、ご協力ありがとうございます。

引用:

NAOさんの書き込み (2005-04-22 15:08) より:

declare @CustomerID nvarchar(5)
declare @Test nvarchar(100)
declare @Test1 nvarchar(100)
set @CustomerID = 'ALFKI'
set @Test ='select CompanyName from Customers where CustomerID ='
set @Test1= @Test+ @CustomerID
Print @CustomerID
Print @Test
Print @Test1

とやって一応入っている物を表示させると

ALFKI
select CompanyName from Customers where CustomerID =
select CompanyName from Customers where CustomerID =ALFKI

となります。



NAOさんを真似て、
Print @Customer
を成功した方に追加してみたところ、結果は

ALFKI

となりました。
同じ結果なのに、どうしてこっちは文字列として認識しているのでしょうか。
もう分からなくて泣きそうです...
hana
ベテラン
会議室デビュー日: 2003/02/08
投稿数: 70
投稿日時: 2005-04-22 15:31
夏椰さん、返信ありがとうございます。

引用:

夏椰さんの書き込み (2005-04-22 15:25) より:
set @CustomerID = '''ALFKI'''
でいれれました(^^)



実際には、@CustomerIDはストアドプロシージャの引数として
受け取ったものが入るのですが、
この場合、SQL文の方を加工した方がいいのでしょうか。

[ メッセージ編集済み 編集者: hana 編集日時 2005-04-22 15:32 ]

スキルアップ/キャリアアップ(JOB@IT)