在动态 SQL 的“IN”子句中使用 CSV 字符串值

Posted

技术标签:

【中文标题】在动态 SQL 的“IN”子句中使用 CSV 字符串值【英文标题】:Using CSV string Values in 'IN' clause of Dynamic SQL 【发布时间】:2015-08-04 11:26:11 【问题描述】:

我有一个存储过程,它接受 csv 字符串作为参数,例如。 ('IN\libin.jose,IN\Pallabi.P')。存储过程包含一些在 IN 子句中使用此参数的动态 sql,例如:(AND u1.UserName IN (' + @UserNames + '))。由于这是在动态 sql 中,如果不将额外的单引号附加到 CSV 值,则条件不会通过,例如 ('''IN\libin.jose '' ,''IN\Pallabi.P''')

--exec [GetUwParameterDetails] 'IN\libin.jose,IN\Pallabi.P' , 'false'
ALTER PROCEDURE [dbo].[GetUwParameterDetails]

@UserNames nvarchar(max),
@IncludeInactiveusers bit

AS
BEGIN

declare @selectedUsers nvarchar(max)
--set @selectedUsers = '''IN\libin.jose ''	,''IN\Pallabi.P''';
set @selectedUsers = 'IN\libin.jose,IN\Pallabi.P';
declare @selectedPermissions nvarchar(max)
set @selectedPermissions = '''Underwrite'',''ManageUwTeamPipeline''';

DECLARE @parameterQuery1 AS NVARCHAR(MAX);



set @parameterQuery1 = '

;WITH cte_users
AS (
	SELECT users.id
		,users.UserName
		,users.FirstName
		,users.lastname
		,users.Email
		,users.E3UserName	
		,UserStatus.[Status]
		,Widgets.[Description] DefaultWidget
	FROM users 
	INNER JOIN userparametervalues upv ON users.id = upv.userid
	INNER JOIN Parameters p on upv.ParameterId = p.id 
		AND p.Name = ''UwHierarchy''
	INNER JOIN UserPermissions up ON users.id = up.userid
	INNER JOIN [Permissions] ps on up.PermissionId = ps.Id 
		AND ps.IsActive = 1 AND ps.Name IN ('+ @selectedPermissions +')
	INNER JOIN users AS u1 ON upv.value = u1.id
		AND u1.UserName IN (' + @UserNames + ')	
    INNER JOIN UserStatus ON users.StatusId = UserStatus.Id
	LEFT JOIN Widgets ON users.WidgetId = Widgets.Id )select * from cte_users ';
	exec @parameterQuery1

	END

我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

在 BEGIN 之后使用它

set @UserNames =''''+replace(@usernames,',',''',''')+''''

【讨论】:

以上是关于在动态 SQL 的“IN”子句中使用 CSV 字符串值的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中从字符串数组(或元组)创建动态 sql“in list”子句的“最佳”方法是啥? [复制]

如何在使用变量的动态查询中指定 IN 子句?

我可以使用Java代码在sql语句(Oracle)的IN子句中传递字符串列表吗

在本机 sql 查询中使用 IN 子句

SQL Server 使用 in 子句从表中选择字符串

如何在选择语句的“NOT IN”子句中使用逗号分隔的字符串列表作为 pl/sql 存储的函数参数