如何将带单引号的字符串传递给in()

时间:2019-09-11 18:18:19

标签: sql-server sql-server-2012

我正在处理需要修改的查询,以便将字符串传递给in()。该视图表正在由其他某个视图表使用,并最终被存储过程使用。字符串值必须在“”中。

iframeName = Split(objIE.document.getElementById("gsft_main").Title, " | ")    'Title = "TSK0111065 | Issue Task | ServiceNow"
EN_ID = iframeName(0)

building_id的值将在执行时在存储过程级别输入。

2 个答案:

答案 0 :(得分:0)

请检查以下脚本,这些脚本将为您提供答案。

方法1 :使用XML拆分CSV值,并在条件适当的地方直接使用选择查询

DECLARE @StrBuildingIDs VARCHAR(1000)

SET @StrBuildingIDs = '101,102'

SELECT 
    vm.region, 
    vm.county, 
    vm.name
FROM vw_main vm
WHERE vm.state = 'MD'
AND vm.building_id IN
(
    SELECT
        l.value('.','VARCHAR(20)') AS Building_Id
    FROM
    (
        SELECT CAST('<a>' + REPLACE(@StrBuildingIDs,',','</a><a>') + '</a>') AS BuildIDXML
    ) x
    CROSS APPLY x.BuildIDXML.nodes('a') Split(l)
)

方法2 :使用XML拆分CSV值,创建变量表并将其用于where条件

DECLARE @StrBuildingIDs VARCHAR(1000)

SET @StrBuildingIDs = '101,102'

DECLARE @TblBuildingID TABLE(BuildingId INT)

INSERT INTO @TblBuildingID(BuildingId)
SELECT
    l.value('.','VARCHAR(20)') AS Building_Id
FROM
(
    SELECT CAST('<a>' + REPLACE(@StrBuildingIDs,',','</a><a>') + '</a>') AS BuildIDXML
) x
CROSS APPLY x.BuildIDXML.nodes('a') Split(l)

SELECT 
    vm.region, 
    vm.county, 
    vm.name
FROM vw_main AS vm
WHERE vm.state = 'MD'
AND vm.building_id IN
(
    SELECT
        BuildingId
    FROM @TblBuildingID
)

方法3 :使用XML拆分CSV值,创建变量表并将其用于INNER JOIN

答案 1 :(得分:-1)

假设输入字符串不是最终用户输入的 ,则可以执行此操作。也就是说,是从另一个表或其他受控源派生或提取的。

DECLARE @in nvarchar(some length) = N'''a'',''b'',''c'''
declare @stmt nvarchar(4000) = N'
select region, county, name
from vw_main
where state = ''MD''
and building_id in ({instr})'

set @stmt = replace(@stmt, N'{instr}', @instr)
exec sp_executesql @stmt=@stmt;

如果输入是来自最终用户的,则这是更安全的:

declare @ table (a int, b char)
insert into @(a, b) values (1,'A'), (2, 'B')
declare @str varchar(50) = 'A,B'

select t.* from @ t
join (select * from string_split(@str, ',')) s(b)
on t.b = s.b

无论如何,您可能会更喜欢它,因为不涉及动态sql。但是,您必须运行SQL Server 2016或更高版本。