TSQL 字符串修改
TSQL String modify
我的字符串有问题。
我有一个看起来像 'ASD,ZXC,QWE,IOP,JKL' 的变量 @Rights
我需要做的是在
中使用这个字符串
SELECT * FROM dbo.Example
WHERE Rights IN (@Rights)
问题是我需要转换:
'ASD,ZXC,QWE,IOP,JKL'
至:
'ASD','ZXC','QWE','IOP','JKL'
我该怎么做?
您可以使用动态 SQL:
-- sample data
CREATE TABLE #Example(ID INT IDENTITY(1,1), Rights VARCHAR(100));
INSERT INTO #Example VALUES ('ASD'), ('ABC'), ('IOP');
DECLARE @Rights NVARCHAR(MAX) = 'ASD,ZXC,QWE,IOP,JKL';
DECLARE @sql NVARCHAR(MAX) =
N'SELECT *
FROM #Example
WHERE Rights IN (''<placeholder>'')';
SET @sql = REPLACE(@sql, '<placeholder>', REPLACE(@Rights, ',', ''','''));
-- SELECT @sql; -- for debug
EXEC dbo.sp_executesql
@sql;
但您应该重新考虑使用 Table 值参数。
你可以创建一个拆分函数
CREATE FUNCTION [dbo].[Split]
(
@String NVARCHAR(4000),
@Delimiter NCHAR(1)
)
RETURNS TABLE
AS
RETURN
(
WITH Split(stpos,endpos)
AS(
SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos
UNION ALL
SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1)
FROM Split
WHERE endpos > 0
)
SELECT 'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
'Data' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos)
FROM Split
)
GO
然后你可以在临时文件中转换字符串 table
DECLARE @Rights NVARCHAR(128)
SET @Rights = 'ASD,ZXC,QWE,IOP,JKL'
SELECT *
INTO #Temp
FROM dbo.Split(@Rights , ',')
然后您可以像这样在查询中使用它
SELECT * FROM dbo.Example
WHERE Rights IN (SELECT Data FROM #Temp)
你可以这样试试:
DECLARE @xml xml, @str varchar(100), @delimiter varchar(10)
SET @str = 'ASD,ZXC,QWE,IOP,JKL'
SET @delimiter = ','
SET @xml = cast(('<X>'+replace(@str, @delimiter, '</X><X>')+'</X>') as xml)
SELECT C.value('.', 'varchar(10)') as value FROM @xml.nodes('X') as X(C)
我的字符串有问题。 我有一个看起来像 'ASD,ZXC,QWE,IOP,JKL' 的变量 @Rights 我需要做的是在
中使用这个字符串SELECT * FROM dbo.Example
WHERE Rights IN (@Rights)
问题是我需要转换:
'ASD,ZXC,QWE,IOP,JKL'
至:
'ASD','ZXC','QWE','IOP','JKL'
我该怎么做?
您可以使用动态 SQL:
-- sample data
CREATE TABLE #Example(ID INT IDENTITY(1,1), Rights VARCHAR(100));
INSERT INTO #Example VALUES ('ASD'), ('ABC'), ('IOP');
DECLARE @Rights NVARCHAR(MAX) = 'ASD,ZXC,QWE,IOP,JKL';
DECLARE @sql NVARCHAR(MAX) =
N'SELECT *
FROM #Example
WHERE Rights IN (''<placeholder>'')';
SET @sql = REPLACE(@sql, '<placeholder>', REPLACE(@Rights, ',', ''','''));
-- SELECT @sql; -- for debug
EXEC dbo.sp_executesql
@sql;
但您应该重新考虑使用 Table 值参数。
你可以创建一个拆分函数
CREATE FUNCTION [dbo].[Split]
(
@String NVARCHAR(4000),
@Delimiter NCHAR(1)
)
RETURNS TABLE
AS
RETURN
(
WITH Split(stpos,endpos)
AS(
SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos
UNION ALL
SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1)
FROM Split
WHERE endpos > 0
)
SELECT 'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
'Data' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos)
FROM Split
)
GO
然后你可以在临时文件中转换字符串 table
DECLARE @Rights NVARCHAR(128)
SET @Rights = 'ASD,ZXC,QWE,IOP,JKL'
SELECT *
INTO #Temp
FROM dbo.Split(@Rights , ',')
然后您可以像这样在查询中使用它
SELECT * FROM dbo.Example
WHERE Rights IN (SELECT Data FROM #Temp)
你可以这样试试:
DECLARE @xml xml, @str varchar(100), @delimiter varchar(10)
SET @str = 'ASD,ZXC,QWE,IOP,JKL'
SET @delimiter = ','
SET @xml = cast(('<X>'+replace(@str, @delimiter, '</X><X>')+'</X>') as xml)
SELECT C.value('.', 'varchar(10)') as value FROM @xml.nodes('X') as X(C)