我正在处理需要修改的查询,以便将字符串传递给in()。该视图表正在由其他某个视图表使用,并最终被存储过程使用。字符串值必须在“”中。
iframeName = Split(objIE.document.getElementById("gsft_main").Title, " | ") 'Title = "TSK0111065 | Issue Task | ServiceNow"
EN_ID = iframeName(0)
building_id的值将在执行时在存储过程级别输入。
答案 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或更高版本。