Saltar al contenido

Escape de comillas simples en openquery usando una consulta dinámica

Solución:

Necesita comillas simples alrededor de sus variables ya que está tratando de convertirlas en cadenas literales. Pero también lo complica el hecho de que está intentando crear una declaración SQL en una cadena que incluye otra declaración SQL en una cadena. Entonces necesitas hacer que tu línea se lea como:

And cases.code IN (''''' + @A +''''', ''''' + @B + ''''')

Necesita dos conjuntos de comillas dobles para que el literal de cadena dentro de su literal de cadena se interprete correctamente. ¿Eh? Derecha. 🙂

En última instancia, debe crear una cadena que tenga esta sintaxis SQL válida:

Select * From Openquery(LinkedServerName,'SELECT cases.casenum, user.username, code
            From cases
            Inner join user
            On cases.casenum = user.user_id
            Where cases.date_opened > DateAdd(day,1-datepart(dw,Convert(date,20150501)), Convert(date,20150501))
            And cases.date_opened <= DateAdd(day,8-datepart(dw,Convert(date,20150501)), Convert(date,20150501))
            And cases.code IN (''AAA'', ''BBB'')
            ORDER BY casenum')

Necesita dos comillas alrededor de AAA y BBB en su cadena SQL interna porque también es código SQL dentro de una cadena. Por lo tanto, necesita comillas dobles dobles para obtener comillas dobles dentro de la cadena principal que está construyendo.

Usando la respuesta de Brian Pressler, sugiero crear una función para formatear los parámetros si tiene varias llamadas a openquery, a veces citar muchas podría ser rompedor.

CREATE FUNCTION [dbo].[Ufn_QuoteFormat]   
( @param varchar(200) --Modify accord your requirement)     
RETURNS varchar(208)
AS    
BEGIN   
  DECLARE @SingleQuote char(1) = CHAR(39)   
  RETURN  @SingleQuote + @SingleQuote + @param + @SingleQuote [email protected]   
END

Entonces puedes usarlo en tus consultas abiertas de esta manera:

Declare @OPENQUERY nvarchar(500), @TSQL nvarchar(max), @LinkedServer nvarchar(20), @A varchar(5), @B varchar(5), @PickedDate varchar(8)
Set @PickedDate="20150501"
Set @A = 'AAA'
Set @B = 'BBB'
Set @LinkedServer="LinkedServerName"
Set @OPENQUERY = 'Select * From Openquery('+ @LinkedServer + ','''
Set @TSQL = 'SELECT cases.casenum, user.username, code
            From cases
            Inner join user
            On cases.casenum = user.user_id
            Where cases.date_opened > DateAdd(day,1-datepart(dw,Convert(date,' + @PickedDate + ')), Convert(date,' + @PickedDate + '))
            And cases.date_opened <= DateAdd(day,8-datepart(dw,Convert(date,' + @PickedDate + ')), Convert(date,' + @PickedDate + '))
            And cases.code IN (' + [dbo].[Ufn_QuoteFormat](@A) +', ' + [dbo].[Ufn_QuoteFormat](@B) + ')
            ORDER BY casenum'')'
Exec (@[email protected])
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *