C# 如何将字符串列表传递给dapper以从中选择值
我想让我们简洁地传递一个id列表,并构建一个select语句,如C# 如何将字符串列表传递给dapper以从中选择值,c#,sql-server,dapper,C#,Sql Server,Dapper,我想让我们简洁地传递一个id列表,并构建一个select语句,如 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 = tenant
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创建一个类型就可以做到这一点呢?正如肖恩所提到的,这里有一个小片段,演示了如何在没有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)
如果您使用的是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)
您必须传入一个带分隔符的字符串,然后使用动态sql或解析该字符串。TVP是一种更简单、更高效的解决方案。这种方法有什么问题?@SeanLange我的TVP问题是在查询运行时必须创建一个类型。我正在寻找一种设置表变量的方法,但这似乎也不是一个选项。不确定“在查询运行时创建类型”是什么意思。TVP需要一个定义正确的表类型?这是正确的。必须先定义表类型,然后才能将其作为参数发送。
DECLARE @j AS NVARCHAR(max) = '["2f1a5d4b-008a-496e-b0cf-ba8b53224247", "bf63102b-0244-4c9d-89ae-bdd7b41f135c"]';
SELECT [value] FROM OPENJSON(@j)