0

パフォーマンスのリストを含むテーブルがあります。これらの公演は、製造番号ごとにグループ化されています。私がやろうとしているのは、入力された各プロダクションの最後のパフォーマンスを返すストアド プロシージャを作成することです。プロダクション ID を ID のリストとして入力できるようにしたいと考えています。以下は、これまでの私の手順です。難しいのは、IN ステートメントで使用される @prod_no パラメータを宣言する最善の方法がわからないことです。

CREATE PROCEDURE IP_MAX_PERF_DATE 
-- Add the parameters for the stored procedure here
@prod_no 
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
SELECT [prod_season_no], MAX([perf_dt]) As max_dt FROM [T_PERF] WHERE [prod_season_no] IN (@prod)
GROUP By [prod_season_no];
END
GO

何か案は

4

3 に答える 3

3

sp_executesql を試す

CREATE PROCEDURE IP_MAX_PERF_DATE 
@prod_no  nvarchar(500)
AS
BEGIN
SET NOCOUNT ON;
declare @statement nvarchar(1000)
set @statement = N'SELECT [prod_season_no], MAX([perf_dt]) As max_dt FROM [T_PERF] WHERE [prod_season_no] IN (' + @prod_no + ') GROUP By [prod_season_no]'
EXEC sp_executesql 
         @stmt = @statement
END
GO
于 2013-09-13T02:05:39.850 に答える
2

通常、ID のリストを渡す方法は 3 つあります。

オプション 1: コンマ区切りのリストを使用し、ストアド プロシージャで分割します。これには、分割関数を用意するか、動的 sql を使用する必要があります (パフォーマンスの問題のために、ほとんどの場合は好ましくありません。少なくとも実行計画を確認するのが難しく、クエリを最適化するためにストアド プロシージャを使用する意味が失われます)。

オプション 2: xml を使用します。再度、xml にクエリを実行して ID を確認する必要があります。

オプション 3: テーブル値パラメーターを使用します。これには、ユーザー定義のテーブル タイプが必要です。

詳細な比較については、 http ://www.adathedev.co.uk/2010/02/sql-server-2008-table-valued-parameters.html を参照してください。

于 2013-09-13T02:06:35.177 に答える
0

これは、コンマ区切りの整数 ID を渡すために私がいつも行ってきたことです。

ALTER FUNCTION [dbo].[SplitArray]
(
@List varchar(500)
)
RETURNS 
@ArrayValues table
(
ListID int
)
AS
BEGIN
DECLARE @ListID varchar(10), @Pos int

SET @List = LTRIM(RTRIM(@List))+ ','
SET @Pos = CHARINDEX(',', @List, 1)

IF REPLACE(@List, ',', '') <> ''
BEGIN
    WHILE @Pos > 0
    BEGIN
        SET @ListID = LTRIM(RTRIM(LEFT(@List, @Pos - 1)))
        IF @ListID <> ''
        BEGIN
            INSERT INTO @ArrayValues (ListID) 
            VALUES (CAST(@ListID AS int)) --Use Appropriate conversion
        END
        SET @List = RIGHT(@List, LEN(@List) - @Pos)
        SET @Pos = CHARINDEX(',', @List, 1)

    END
END 
RETURN
    END

これを使用するには、次のようにクエリに結合するだけです。 Select a.* From Apples a Inner Join dbo.SplitArray(@IDList) array on a.AppleID = array.ListID

于 2013-09-13T11:56:10.853 に答える