我有2张桌子
Account(AccountId, Encoding)
DeviceAccountMap(AccountId, DeviceId)
现在我需要从DeviceAccountMap
获取设备。我将AccountId
列表传递给存储过程,在从DeviceId
表中提取DeviceAccountMap
时,我需要将每个帐户的Encoding
值与特定值进行比较。
这是一种简单的方法吗?我完全迷失了。
存储过程中的select子句如下所示:
DECLARE @Accounts [usp].[Array]
和[usp].[Array]
定义如下
CREATE TYPE [usp].[Array] AS TABLE
(
Value VARCHAR(36) NULL
)
SELECT
DeviceId,
AccountEncoding = A.Encoding
FROM
usp.DeviceControllerAccountMap DCAM
INNER JOIN
usp.Account A ON (DCAM.AccountId = A.AccountId)
WHERE
DCAM.AccountId IN (SELECT Value From @AccountIds)
AND DCAM.IsShared = 1
AND AccountEncoding LIKE A.Encoding + '.%'
换句话说,我需要获取每个帐户的编码值,并在此where子句中使用它。
答案 0 :(得分:1)
以下行完全没必要。 JOIN to Account会为您过滤此过滤器。
DCAM.AccountId IN (SELECT Value From @AccountIds)
或者我错过了什么?
答案 1 :(得分:1)
因此,您可以在T-SQL中查找有关表值参数(TVP)的信息。
<强> Here is an article by Erland Sommarskog. 强>
您可以参考 this StackOverflow answer 查看调用使用TVP的存储过程的C#代码示例。我相信TVP需要SQL Server 2008或更高版本。
据我所知,TVP提供了一种在sql server中创建自己的数据类型的方法,它被视为表格。当您声明Array
类型,然后在存储过程的select语句中使用@AccountIds
时,您就会这样做。
CREATE TYPE [usp].[Array] AS TABLE -- maybe choose a more descriptive name than 'Array'
(
Value VARCHAR(36) NULL -- choose a more descriptive name than 'Value'
)
CREATE PROCEDURE [usp].[your_procedure_name]
@AccountIds [usp].[Array] READONLY -- use TVP as a parameter
AS
SELECT …
您的问题详细信息尚不清楚您是否还要在Encoding
的存储过程中使用参数。您似乎正在寻找编码以一段时间开始的帐户。&#39;。
首先,创建您的类型,就像您正在做的那样。 然后创建您的存储过程。 然后测试你的存储过程,如下所示:
DECLARE @mylist Array -- make TVP sample data
INSERT @mylist(Value) VALUES(1),(11),(27),(123) -- insert some values
exec your_procedure_name @mylist -- run stored procedure