thousands - sql server in string
TSQL String modify (3)
Puede usar SQL dinámico:
-- 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)
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)