Sql 选择查询根据另一个表中的值选择值
我有两张桌子 AccountID,编码 DeviceAccountMapAccountId,设备ID 现在我需要从DeviceAccountMap获取设备。我将AccountId列表传递给存储过程,在从DeviceAccountMap表中获取DeviceId时,我需要将每个帐户的编码值与特定值进行比较 哪种方法最简单?我完全迷路了 存储过程中的select子句如下所示:Sql 选择查询根据另一个表中的值选择值,sql,sql-server,Sql,Sql Server,我有两张桌子 AccountID,编码 DeviceAccountMapAccountId,设备ID 现在我需要从DeviceAccountMap获取设备。我将AccountId列表传递给存储过程,在从DeviceAccountMap表中获取DeviceId时,我需要将每个帐户的编码值与特定值进行比较 哪种方法最简单?我完全迷路了 存储过程中的select子句如下所示: DECLARE @Accounts [usp].[Array] DECLARE @mylist Array
DECLARE @Accounts [usp].[Array]
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
[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子句中使用该值。下面的行完全没有必要。“加入到”帐户会为您执行此筛选
DCAM.AccountId IN (SELECT Value From @AccountIds)
还是我遗漏了什么?所以您可以在T-SQL中查找表值参数TVP的信息 您可以参考以查看C代码调用使用TVP的存储过程的示例。我相信TVP需要SQL Server 2008或更高版本 据我所知,TVPs提供了一种在sql server中创建自己的数据类型的方法,该数据类型被视为一个表。当您声明数组类型,然后在存储过程的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 …
从您的问题详细信息中不清楚您是否还打算在存储过程中使用参数进行编码。似乎您正在查找编码以句点“.”开头的帐户
因此,首先,像现在这样创建您的类型。
然后创建存储过程。
然后测试存储过程,如下所示:
DECLARE @Accounts [usp].[Array]
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
我认为最后一行是问题所在。尝试和A.编码方式类似于“无论您比较什么”,首先,使用列值的UDT[usp].[Array]允许插入空值,并且您使用IN运算符检查该列中的值,如果该列中存在任何空值,则会产生意外结果。使其不可为null或使用EXISTS运算符检查该列中的值。