我将文本存储在“StructureStrings”表中
Create Table StructureStrings(Id INT Primary Key,String nvarchar(4000))
样本数据:
Id字符串 1从员工中选择*其中Id BETWEEN ###和###以及客户ID> ### 2从客户中选择* ID BETWEEN ###和### 3从部门中选择*其中Id = ###
我想用从另一个名为“StructureValues”的表中获取的值替换“###”单词
Create Table StructureValues (Id INT Primary Key,Value nvarcrhar(255))
Id Value
1 33
2 20
3 44
我想替换字符串中的“###”标记
Select * from Employee where Id BETWEEN 33 and 20 and Customer Id> 44
Select * from Customer where Id BETWEEN 33 and 20
Select * from Department where Id=33
PS:1。这里假设这些值将以相同的顺序替换为令牌,即“###”的第一次出现将被“StructureValues.Value”列的第一个值替换,依此类推。
将此作为新答案发布,而不是编辑我以前的答案。
这使用Jeff Moden's DelimitedSplit8K;它不使用SQL Server 2016中可用的内置拆分器,因为它不提供项目编号(因此没有连接标准)。
您需要首先将该功能放在您的服务器上,然后您就可以使用它了。不要指望它表现良好。这里有很多REPLACE
,这将阻碍性能。
SELECT (SELECT REPLACE(DS.Item, '###', CONVERT(nvarchar(100), SV.[Value]))
FROM StructureStrings sq
CROSS APPLY DelimitedSplit8K (REPLACE(sq.String,'###','###|'), '|') DS --NOTE this uses a varchar, not an nvarchar, you may need to change this if you really have Unicode characters
JOIN StructureValues SV ON DS.ItemNumber = SV.Id
WHERE SS.Id = sq.id
FOR XML PATH ('')) AS NewString
FROM StructureStrings SS;
如果您有任何疑问,请将评论放在这个答案上;不要把它们置于已经成为长期讨论的问题之下。
也许这就是你要找的东西。
DECLARE @Employee TABLE (Id int)
DECLARE @StructureValues TABLE (Id int, Value int)
INSERT INTO @Employee
VALUES (1), (2), (3), (10), (15), (20), (21)
INSERT INTO @StructureValues
VALUES (1, 10), (2, 20)
SELECT *
FROM @Employee
WHERE Id BETWEEN (SELECT MIN(Value) FROM @StructureValues) AND (SELECT MAX(Value) FROM @StructureValues)
这里非常不同:
CREATE TABLE StructureStrings(Id int PRIMARY KEY,String nvarchar(4000));
INSERT INTO StructureStrings
VALUES (1,'SELECT * FROM Employee WHERE Id BETWEEN ### AND ###'),
(2,'SELECT * FROM Customer WHERE Id BETWEEN ### AND ###');
CREATE TABLE StructureValues (Id int, [Value] int);
INSERT INTO StructureValues
VALUES (1,10),
(2,20);
GO
DECLARE @SQL nvarchar(4000);
--I'm asuming that as you gave one output you are supplying an ID or something?
DECLARE @Id int = 1;
WITH CTE AS(
SELECT SS.Id,
SS.String,
SV.[Value],
LEAD([Value]) OVER (ORDER BY SV.Id) AS NextValue,
STUFF(SS.String,PATINDEX('%###%',SS.String),3,CONVERT(varchar(10),[Value])) AS ReplacedString
FROM StructureStrings SS
JOIN StructureValues SV ON SS.Id = SV.Id)
SELECT @SQL = STUFF(ReplacedString,PATINDEX('%###%',ReplacedString),3,CONVERT(varchar(10),NextValue))
FROM CTE
WHERE Id = @Id;
PRINT @SQL;
--EXEC (@SQL); --yes, I should really be using sp_executesql
GO
DROP TABLE StructureValues;
DROP TABLE StructureStrings;
编辑:请注意,Id 2将返回NULL
,因为LEAD
没有值。如果需要改变,如果LEAD
没有价值,我们需要更多关于价值应该是什么的逻辑。
编辑2:这是基于OP的原始帖子,而不是他后面提到的。目前看来,这是不可能的。