[英]How do I get a comma-delimited list of strings from an XML column in T-SQL?
[英]declaring T-Sql parameter for comma delimited list of integers
我有一张包含表演清单的桌子。 这些性能按生产编号分组。 我要尝试做的是创建一个存储过程,该过程将为输入的每个产品返回最后的性能。 我希望能够将生产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
有任何想法吗
试试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
通常,可以通过三种方式传递ID列表:
选项1:使用逗号分隔的列表并将其拆分到存储过程中。 这要求您具有拆分功能或使用动态sql(由于性能问题,大多数情况下不建议使用这种方法-至少很难看到执行计划,并且您失去了使用存储过程来优化查询的意义)
选项2:使用xml,再次,您需要查询xml以查找ID。
选项3:使用表值参数,这要求您具有用户定义的表类型
可以在此处找到详细的比较: http : //www.adathedev.co.uk/2010/02/sql-server-2008-table-valued-parameters.html
对于传递逗号分隔的Integer 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
要使用它,只需像这样在查询中将其加入即可:选择a。*从苹果中a.AppleID = array.ListID上的内部加入dbo.SplitArray(@IDList)数组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.