- PR -

ストアドプロシージャでのLIKE句

1
投稿者投稿内容
ともこ
大ベテラン
会議室デビュー日: 2007/09/14
投稿数: 111
投稿日時: 2007-10-16 19:29
お世話になります。

現在、以下@のようなストアドプロシージャを作成し、実行したのですがAのようなエラーとなってしまいました。
しかし、「SET @statement」に続くLIKE句の指定方法をBのように変更すると正常に実行されます。

何故LIKE句で指定する値の前後にシングルコーテーションが2つづつ必要なのか分かりません。
どなたかご存知の方はアドバイスをお願い致します。


@ストアドプロシージャ
DECLARE @statement nvarchar(300)
SET @statement = 'SELECT *
FROM ビュー名 A'
+ ' WHERE A.フィールド名'+' LIKE 31%'
EXECUTE sp_executesql @statement

AエラーMSG
行 2: '%' の近くに無効な構文があります。
該当する行はありません。
(0 行が返されました)
@RETURN_VALUE = 0
[dbo].[CO_S_0001] の実行が完了しました。

B変更内容
' LIKE 31%'の部分を 'LIKE ''31%''' とすると正常に実行される
忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2007-10-16 20:18
質問する場合は、RDBMS名、バージョンを明記してください。
構文から推測すると、RDBMSは、SQL Serverですね?

' WHERE A.フィールド名'+' LIKE 31%'では、文字結合した結果の文字列は、
「WHERE A.フィールド名 LIKE 31%」になります。
LIKEのパターン文字列は、「'」で囲む必要があるので、これでは構文エラーになって
当然です。
「'LIKE ''31%''」とすることにより、文字連結の結果を「LIKE '31%'」とすることができ、
SQLの構文としても正しくなります。


ともこ
大ベテラン
会議室デビュー日: 2007/09/14
投稿数: 111
投稿日時: 2007-10-17 11:50
忠犬さん、ご回答ありがとうございます。
また御察しの通り、RDBMSはSQL Server 2000(SP3a)となります。

忠犬さんのおかげで、
LIKEで指定する場合には、LIKE '31%'とする。
それ自体が文字列の中にある場合には、'LIKE ''31%'''とするというのが分かりました。

今悩んでいるのは'31%'の中の31を変数で受け渡し、結果として'31%'としたい事です。
具体的には、下記のように記述していますが@のケースだと失敗でAでも構文エラーとなります。変数の中に「'」のみを追加するにはどうしたら良いのでしょうか?
どなたかご教授お願いします。

DECLARE @Field1 nvarchar(300)
DECLARE @SQL nvarchar(300)
DECLARE @AAA nvarchar(300)
SET @Field1 = '31'
@--------------------------
SET @AAA = @Field1 + '%'
SET @SQL = 'LIKE ' + @AAA
---------------------------- → LIKE 31% となる
A--------------------------
SET @AAA = ''' + @Field1 + '%''' ・・・31%の前後に「'」と「'」を付けたい
SET @SQL = 'LIKE ' + @AAA
---------------------------- → 構文エラーとなる

かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2007-10-17 13:08
引用:

A--------------------------
SET @AAA = ''' + @Field1 + '%''' ・・・31%の前後に「'」と「'」を付けたい
SET @SQL = 'LIKE ' + @AAA
---------------------------- → 構文エラーとなる


「'」が1コ足りなくないですか?
SET @AAA = '''' + @Field1 + '%'''
ともこ
大ベテラン
会議室デビュー日: 2007/09/14
投稿数: 111
投稿日時: 2007-10-17 15:13
かめたろさん、ご回答ありがとうございます。

引用---------------------------------
「'」が1コ足りなくないですか?
SET @AAA = '''' + @Field1 + '%'''
-------------------------------------

「'」が足りないということですが、
「SET @AAA = '''' + @Field1 + '%'''」と記述すれば文字列として「'31%'」になるという事でしょうか?
かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2007-10-17 16:51
あれ、分かりにくい書き方しちゃいましたかね。

コード:
DECLARE @Field1 nvarchar(300) 
DECLARE @SQL nvarchar(300) 
DECLARE @AAA nvarchar(300) 
SET @Field1 = '31' 

SET @AAA = '''' + @Field1 + '%''' 
SET @SQL = 'LIKE ' + @AAA 

select @SQL


結果
LIKE '31%'

ドコまでがリテラル文字列になるのか意識してみてはいかがでしょうか。
クエリアナライザやマネジメントスタジオを使っているのであれば、リテラルは赤字になりますよね。
ともこ
大ベテラン
会議室デビュー日: 2007/09/14
投稿数: 111
投稿日時: 2007-10-17 18:04
かめたろさん、ありがとうございます!

おかげでLIKE '31%'が取得できました!
どうもこういった記述が不得意で悩んでしまいます。
ご丁寧なアドバイス、ありがとうございました。
1

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