Sql server 如何在“中按多个值搜索”;“始终加密”;专栏?

Sql server 如何在“中按多个值搜索”;“始终加密”;专栏?,sql-server,tsql,sql-server-2016,always-encrypted,Sql Server,Tsql,Sql Server 2016,Always Encrypted,若我使用确定性加密,我可以在加密列中执行搜索。例如: DECLARE @email NVARCHAR(222) = 'test'; SELECT * FROM Users Where email = @email; 但是如何按多个值执行搜索呢?例如,如果我想获取电子邮件地址为userA@gmail.com,userB@gmail.com和userC@gmail.com 我不能创建很多输入参数,因为这些值通常是动态的,例如作为CSVstring传递 在你的情况下,如果适合你,我建议你分开 试试

若我使用确定性加密,我可以在加密列中执行搜索。例如:

DECLARE @email NVARCHAR(222) = 'test';

SELECT *
FROM Users
Where email = @email;
但是如何按多个值执行搜索呢?例如,如果我想获取电子邮件地址为
userA@gmail.com
userB@gmail.com
userC@gmail.com

我不能创建很多输入参数,因为这些值通常是动态的,例如作为
CSV
string传递

在你的情况下,如果适合你,我建议你分开

试试这个查询:让我知道它是否适合您


说明:

  • 我刚刚扩展了您的查询以处理多封电子邮件

  • 正如您所提到的,若您确定输入格式是逗号分隔的字符串,那个么可能值得尝试从中派生表变量

  • 因此,如果您的输入如下:

    DECLARE@email NVARCHAR(222)='userA@gmail.com,userB@gmail.com,userC@gmail.com“

    您可以使用任何tsql技术拆分它,我在这里使用了公共表表达式

  • 一旦你有了表格格式。我在名为
    @EmailParam
    的表变量中找到了它。然后,您可以轻松地使用添加联接并对其进行筛选

  • 如果您的查询使用确定性加密,那么此查询可能以类似的方式工作,因为关于文件管理器的唯一附加更改是我们现在有
    内部连接


据我所见,您需要在应用程序中拥有多个参数或处理这些参数,即:启动多个查询,然后组合结果并处理SQL之外的任何重复Server@iamdave在这两种情况下,这都不是有效的。具有多个参数(我可能需要5个或1000个)。由于SQL Server和应用程序之间传递了大量数据,因此将所有记录退役到客户机应用程序并在那里进行过滤同样是不好的。但是,即使我不喜欢这样,似乎我也别无选择。我所能想到的就是在一段时间内解析csv结构并一次搜索一封电子邮件time@gotqn-让我知道你的确定性加密是否再次有效。@gotqn-你的脚本有效吗<代码>从用户中选择*,其中email=@email当然,它可以工作。因为我启用了始终加密的参数化()
DECLARE @email NVARCHAR(222) = 'userA@gmail.com,userB@gmail.com,userC@gmail.com'
DECLARE @Delimiter NCHAR(1) = ','

DECLARE @EmailParam TABLE(email NVARCHAR(222))

;WITH Split(StPos,EndPos)
AS(
    SELECT 0 AS StPos, CHARINDEX(@Delimiter,@email) AS EndPos
    UNION ALL
    SELECT EndPos+1, CHARINDEX(@Delimiter,@email,EndPos+1)
    FROM Split
    WHERE EndPos > 0
)

INSERT INTO @EmailParam (email)
SELECT SUBSTRING(@email,StPos,COALESCE(NULLIF(EndPos,0),LEN(@email)+1)-StPos) FROM Split

SELECT Users.*
FROM Users
INNER JOIN @EmailParam EmailParam
ON Users.email = EmailParam.email;