1

IP アドレスを 4 つの異なる列に分割するストアド プロシージャを作成しました。

ALTER PROCEDURE ipaddress_split
(
    @str as varchar(max)
)
AS 
BEGIN
    SET NOCOUNT ON

    DECLARE @query as varchar(max)  
    SET  @query = 'SELECT   parsename('+@str+',4) as A
                        ,   parsename('+@str+',3) as B
                        ,   parsename('+@str+',2) as C
                        ,   parsename('+@str+',1) as D';
    EXEC (@query)
    SET NOCOUNT off
END

ただし、パラメーターを渡すとエラーが発生します。

EXEC ipaddress_split @str='191.168.1.1'

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near '.1'.

以下のすべての組み合わせを試しましたが、成功しませんでした。

exec ipaddress_split '191.168.1.1'
exec ipaddress_split 191.168.1.1
exec ipaddress_split ('191.168.1.1')

パラメータをストアドプロシージャに渡す適切な方法は何ですか?

4

2 に答える 2

6

IP アドレス入力を分割するためにクエリを動的に生成する必要はありません。このようなことができます。

ストアド プロシージャ スクリプト:

ALTER PROCEDURE ipaddress_split
(
    @str AS VARCHAR(max)
)
AS  
BEGIN

SET NOCOUNT ON

SELECT  PARSENAME(@str, 4) AS A
    ,   PARSENAME(@str, 2) AS B
    ,   PARSENAME(@str, 3) AS C
    ,   PARSENAME(@str, 1) AS D

SET NOCOUNT OFF

END;

実行ステートメント:

EXEC ipaddress_split @str = '191.168.1.1';

出力:

A   B   C   D
--- --- --- ---
191 1   168 1

問題の理由:

動的クエリは次の形式に評価されます。PARSENAME 関数への入力を文字列として扱っていません。

SELECT parsename(191.168.1.1,4) as A,parsename(191.168.1.1,3) 
as B,parsename(191.168.1.1,2) as C,parsename(191.168.1.1,1) as D

クエリに表示される単一引用符ごとに 2 つの単一引用符を追加して、set クエリ ステートメントをこのように変更する必要があります。

set @query = 'SELECT parsename('''+@str+''',4) as A,parsename('''+@str+''',3) 
as B,parsename('''+@str+''',2) as C,parsename('''+@str+''',1) as D';

動的クエリは次のようになります

SELECT parsename('191.168.1.1',4) as A,parsename('191.168.1.1',3) as
B,parsename('191.168.1.1',2) as C,parsename('191.168.1.1',1) as D

とにかくあなたのやり方をすることはお勧めしません。それは正しい方法ではありません。

于 2012-04-30T12:31:38.207 に答える
1
set @query = 'SELECT PARSENAME('''+@str+''',4) as A ,PARSENAME('''+@str+''',3) as B,PARSENAME('''+@str+''',2) as C,PARSENAME('''+@str+''',1) as D'
EXEC (@query)

これを試して。それはうまくいくはずです。

それ以外の場合は、次のようなパラメーターを渡します。

exec ipaddress_split @str='''191.168.1.1'''

あなたの場合、クエリを実行すると、IP as が見つかりませんstring

于 2012-04-30T12:49:47.550 に答える