transact thousands stuff special sintaxis number left functions funciones escape characters string tsql variables varchar

thousands - sql server in string



TSQL String modify (3)

Puede usar SQL dinámico:

Demo en vivo

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

Pero debería reconsiderar el uso de Parámetro de valor de tabla en su lugar.

Tengo un problema con la cadena. Tengo una variable @Rights que se parece a ''ASD, ZXC, QWE, IOP, JKL'' Lo que tengo que hacer es usar esta cadena en

SELECT * FROM dbo.Example WHERE Rights IN (@Rights)

El problema es que necesito convertir:

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

a:

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

¿Cómo puedo hacer esto?


Puedes intentarlo así:

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)

DEMO de SQL


puedes crear una función dividida

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

y después de que puedas convertir la cadena en una tabla temporal

DECLARE @Rights NVARCHAR(128) SET @Rights = ''ASD,ZXC,QWE,IOP,JKL'' SELECT * INTO #Temp FROM dbo.Split(@Rights , '','')

y luego puedes usarlo en tu consulta como esta

SELECT * FROM dbo.Example WHERE Rights IN (SELECT Data FROM #Temp)