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 回答