2016-09-23 14 views
1

私は、渡された値に基づいていくつかの列を更新する動的SQLを使用するストアドプロシージャを持っています。私は手動でそれらを入力することなく複数の値のためにそれをテストしようとしています。これらの値は表から取られる。これらの値をすべてテーブルに渡してprocを通過させる方法はありますか?通常のプログラミング言語のように、配列を実行します。私は2012年テーブルからストアドプロシージャに整数値の配列を渡す方法は?

コードは、私は別の値を持つテーブルからその整数パラメータ(@enteredvalue)の値を入力します。この

CREATE PROCEDURE sp1 @enteredvalue int 
AS 
BEGIN 
    UPDATE table1 
    SET column1 = 'some var char value', 
     column2 = 'some integer values' 
    WHERE xid = @enteredvalue 
END 

のようなものであるSQL Serverの中でこれをやっています。

+1

サンプルデータとサンプルコードがないと、あなたの質問は非常に曖昧です。 SQL Serverには配列の概念がないということを付け加えておきます。これはあまり明確ではありません。 –

+0

okコードサンプルを追加 – croxfade

+0

カーソルを使用してすべての値を調べ、プロシージャを呼び出そうとしましたか? – Padhraic

答えて

2

必要であれば、おそらく、もう少しダイナミックSQLは、(パーサと一緒に)トリック

Declare @String varchar(max) = '1,25,659' 
Declare @SQL varchar(max) = '' 
Select @SQL = @SQL + concat('Exec [dbo].[sp1] ',Key_Value,';',char(13)) 
From (Select * from [dbo].[udf-Str-Parse-8K](@String,',')) A 

Select @SQL 
--Exec(@SQL) 

戻り

Exec [dbo].[sp1] 1; 
Exec [dbo].[sp1] 25; 
Exec [dbo].[sp1] 659; 

UDFを行います(超高速!)

CREATE FUNCTION [dbo].[udf-Str-Parse-8K](@String varchar(8000), @Delimiter varchar(50)) 
Returns Table 
As 

--Usage: Select * from [dbo].[udf-Str-Parse-8K]('Dog,Cat,House,Car',',') 
--  Select * from [dbo].[udf-Str-Parse-8K]('John||Cappelletti||was||here','||') 
--  Select * from [dbo].[udf-Str-Parse-8K]('The quick brown fox',' ') 

Return (
    with cte1(N) As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)), 
     cte2(N) As (Select Top (IsNull(DataLength(@String),0)) Row_Number() over (Order By (Select NULL)) From (Select N=1 From cte1 a, cte1 b, cte1 c, cte1 d) A), 
     cte3(N) As (Select 1 Union All Select t.N+DataLength(@Delimiter) From cte2 t Where Substring(@String,t.N,DataLength(@Delimiter)) = @Delimiter), 
     cte4(N,L) As (Select S.N,IsNull(NullIf(CharIndex(@Delimiter,@String,s.N),0)-S.N,8000) From cte3 S) 

    Select Key_PS = Row_Number() over (Order By A.N) 
     ,Key_Value = Substring(@String, A.N, A.L) 
     ,Key_Pos = A.N 
    From cte4 A 
) 
+0

私はこの厳密な方法に従わなかったが、これは私にexec文を生成し、実行させる考えを与えた。ありがとうございました! – croxfade

+0

@croxfadeあなたがそれを構築するときにさらに優れています。よくやった。乾杯 –

1

SPにテーブルを渡すには、ユーザー定義テーブル型を作成することを検討。例:

create type ArrayOfInt as table (IntVal int) 
go 


create proc SumArray(@IntArray ArrayOfInt readonly) 
as 
select sum(IntVal) from @IntArray 
go 

declare @IntArray ArrayOfInt 

insert @IntArray values (1), (2), (3) 

select * from @IntArray 

exec SumArray @IntArray 

drop proc SumArray 

drop type ArrayOfInt 
+0

はい、どうすればこのユーザー定義テーブルを既に存在するストアドプロシージャsp1に渡すことができますか?私はユーザー定義のテーブルを実行しようとしましたが、これを把握することはできませんでした。これは私にとって初めてのことです。 – croxfade

+0

残念ながら、オリジナルのintパラメータを置き換えるために、この新しく定義されたUser-Defined Table型を受け入れるようにsp1を修正する必要があります。 –

関連する問題