5

SQL Server でストアド プロシージャを実行する場合があります。

珍しいやり方かもしれませんが、ストアド プロシージャ名のリストをテーブルに格納しました。テーブルは次のようになります ( と呼びましょうTableFoo):

| SPId |  SPName  |
-------------------
|  1   | spr_name1|
|  2   | spr_name2|
|  3   | spr_name3|
|  4   | spr_name4|
...

のクエリ結果から生成されたストアド プロシージャのリストを呼び出し/実行したいのですがTableFoo、クエリは次のようになります。

SELECT SPName 
FROM TableFoo 
WHERE SPId IN (1, 2, 3)

ストアドプロシージャを行ごとに順番に実行したい

つまり、私はこれをやりたいです:)

SELECT EXEC(SpName)
FROM TableFoo
WHERE SPId IN (1, 2, 3)

しかし、それはうまくいきません

を使用する以外の解決策はありCURSORますか?

前もって感謝します。

4

5 に答える 5

5

文字列集約を使用して、すべてのプロシージャを呼び出す単一のバッチを作成し、このバッチを実行します。多くの文字列集計連結方法がありますが、最も効果的な方法の 1 つはXML ブラックボックス方法です。

create table #test (spid int, sproc sysname);
insert into #test (spid, sproc) values (1, N'sproc1')
    , (2, N'sproc2')
    , (3, N'sproc3')
    , (4, N'sproc4')
    , (5, N'sproc5')
    , (6, N'sproc6');

declare @sql nvarchar(max);
set @sql = (select N'exec ' + sproc +N';
' from #test 
where spid in (1,3,5) for XML path(''), type).value(N'.', 'nvarchar(max)');

exec sp_executesql @sql;
于 2012-06-16T14:08:19.633 に答える
1

私にも別の選択肢があります

DECLARE @SQL VARCHAR(8000)  

SELECT @SQL=''  

SELECT @SQL = @SQL+ 'Exec ' + b.SPname
FROM TbFoo
WHERE SpId IN (1,2,3)

EXEC(@SQL)

しかし、それで十分ですか?

于 2012-06-22T09:48:22.047 に答える
0
  Declare @SPCall table
 (id int,SP varchar(20))

 Insert into @SPCall
 values
 (1,'sp1'),(2,'sp3'),(3,'sp3')



  Declare @spName varchar(20)
  Declare @value int 
  set @value =1

  While @value<=(Select COUNT(*) from @SPCall)
  BEGIN
  Set @spName=(select Sp from @SPCall where id=@value)
  exec @spName 
  set @value=@value +1
  END
于 2012-06-16T14:11:16.153 に答える
0

まず第一に、これは良いアプローチではありません。ただし、その方法を主張する場合は、ストアド プロシージャで動的 SQL を利用できます。すべての SP 名のリストを一時テーブルにダンプし、そのテーブルでループを使用して、各 SP 名を動的 SQL クエリに渡します。動的にビルドされる T-SQL ステートメントは、EXECUTE コマンドまたは sp_executesql ステートメントを使用して実行できます。後者、つまり sp_executesql を使用することをお勧めします。

sp_executesql を使用するための基本的な構文:

sp_executesql [@SQLStatement],[@ParameterDefinitionList],[@ParameterValueList]   

@ParameterDefinition は、SQL 文字列を実行する前にパラメーターの形式を指定するために使用されます。これについては、グーグルで多くの例を得ることができます。それが役立つことを願っています。

于 2012-06-16T14:20:44.347 に答える
0

選択クエリ内では実行できません。カーソルを使用するとニーズを満たすことができますが、非常に複雑に思えます。アプリケーションを開発している場合は、このロジックをアーキテクチャの上位に配置することをお勧めします。

よろしく

于 2012-06-16T13:56:16.523 に答える