TSQL字符串修改

时间:2015-10-08 08:35:11

标签: string tsql variables varchar

我遇到字符串问题。 我有一个变量@Rights,看起来像'ASD,ZXC,QWE,IOP,JKL' 我需要做的是在

中使用此字符串
SELECT * FROM dbo.Example
WHERE Rights IN (@Rights)

问题是我需要转换:

'ASD,ZXC,QWE,IOP,JKL'

为:

'ASD','ZXC','QWE','IOP','JKL'

我该怎么做?

3 个答案:

答案 0 :(得分:1)

您可以创建拆分功能

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

并且可以在临时表中转换字符串

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)

答案 1 :(得分:1)

您可以尝试这样:

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)

<强> SQL DEMO

答案 2 :(得分:0)

您可以使用动态SQL:

<强> LiveDemo

-- 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;

但你应该重新考虑使用表值参数。