这是我的存储过程。有人说使用TVP我可以得到我想要的输出。但我是sql的新手。所以,请有人帮助我,如何通过多个disposeid和多个receiveid,如下所示。现在我需要输出只能使用我能够理解什么是tvp所以有人请编辑我的SP通过其中包含多个值。
USE [Test]
GO
/****** Object: StoredProcedure [dbo].[up_Get_Customers] Script Date: 09/23/2015 19:10:23 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROC [dbo].[up_Get_Customers]
(
@DisposeId int
)
AS
BEGIN
SELECT C1.DisposeDate,C1.DisposeID,C1.ReceiveDate,C1.ReceiveID
FROM Customers C1
LEFT JOIN Customers C2 ON C1.DisposeID=C1.ReceiveID
WHERE @DisposeId IS NULL OR (C1.DisposeID in (@DisposeId,','))
END
GO
答案 0 :(得分:1)
嗯,这是我今天学到的新东西,用微小数量的谷歌搜索我想出了这个
https://msdn.microsoft.com/en-us/library/bb510489%28SQL.100%29.aspx
TVP T 能 V P 参与者。
所以基于链接中的信息:
CREATE TYPE DisposeIdsTable AS TABLE (
DisposeId VARCHAR(50));
GO
然后
USE [Test]
GO
/****** Object: StoredProcedure [dbo].[up_Get_Customers] Script Date: 09/23/2015 19:10:23 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROC [dbo].[up_Get_Customers]
(
@DisposeIds DisposeIdsTable READONLY
)
AS
BEGIN
SELECT C1.DisposeDate,C1.DisposeID,C1.ReceiveDate,C1.ReceiveID
FROM Customers C1
LEFT JOIN Customers C2 ON C1.DisposeID=C1.ReceiveID
WHERE (SELECT COUNT(*) FROM @DisposeIds) = 0
OR
(C1.DisposeID IN (
SELECT DisposeID FROM @DisposeIds
UNION ALL
SELECT ',')))
END
GO
N.B。上面发布的代码根本未经过测试,因此可能包含错误。此外,我对DisposeId
的数据类型做了一个假设,因此不太可能是正确的,需要修改以适合您的数据类型。此外,我试图保留查询的现有逻辑,无论可能是什么。
执行存储过程时,您需要声明类型为DisposeIdsTable
的变量,而不是当前正在使用的文本数据类型。然后需要使用您的ID填充该表变量。