如何将字符串列表传递给dapper以从中选择值

时间:2018-05-25 13:30:59

标签: c# sql-server dapper

我希望我们能够传递一个id列表并构建一个像

这样的选择语句
SELECT Id FROM (VALUES
('2f1a5d4b-008a-496e-b0cf-ba8b53224247'),
('bf63102b-0244-4c9d-89ae-bdd7b41f135c')) AS tenantWithFile(Id)
WHERE   NOT exists( SELECT [Id]

  FROM [dbo].[TenantDetail]AS td
  WHERE td.Id = tenantWithFile.Id
)

我回到列表中不在数据库中的项目。有没有一种简单的方法可以为TVP制作一个类型?

2 个答案:

答案 0 :(得分:0)

正如Sean所提到的,这里有一个小片段,演示了如何在没有TVF的情况下解析分隔的字符串。 ...很容易纳入您的查询。

示例

Declare @YourList varchar(max)='2f1a5d4b-008a-496e-b0cf-ba8b53224247,bf63102b-0244-4c9d-89ae-bdd7b41f135c'

Select Id = xmlnode.n.value('(./text())[1]', 'varchar(max)')
 From  (values (cast('<x>' + replace(@YourList,',','</x><x>')+'</x>' as xml))) xmldata(xd)
 Cross Apply xd.nodes('x') xmlnode(n)

<强>返回

Id
2f1a5d4b-008a-496e-b0cf-ba8b53224247
bf63102b-0244-4c9d-89ae-bdd7b41f135c

答案 1 :(得分:0)

如果您使用的是Azure SQL或SQL Server 2016+,则只需传递一个JSON数组,然后使用OPENJSON将数组转换为表格

DECLARE @j AS NVARCHAR(max) = '["2f1a5d4b-008a-496e-b0cf-ba8b53224247", "bf63102b-0244-4c9d-89ae-bdd7b41f135c"]';
SELECT [value] FROM OPENJSON(@j)