2015-05-18 13 views
7

In SQL Server è presente una funzione incorporata che riporta un identificatore chiamato QUOTENAME. Esiste una funzione che fa il contrario e rimuove le virgolette?Qual è l'opposto della funzione QUOTENAME?

In altre parole, cosa devo sostituire SOMEFUNCTION con il seguente esempio di codice per ottenere che restituisca 1 per qualsiasi valore in cui potrei inizializzare @name?

declare @name nvarchar(50) = 'hello]' 

select 
    case 
     when SOMEFUNCTION(QUOTENAME(@name)) = @name then 1 
     else 0 
    end 
+2

http://www.rmjcs.com/SQLServer/TSQLFunctions/UnQuoteName/tabid/832/Default.aspx – GolezTrol

+1

@GolezTrol si dovrebbe davvero fare una risposta a questo, compreso il codice e il link. – Alexander

+0

Cosa dire di ['QUOTENAME ('Thomas', '' '')'] (https://msdn.microsoft.com/en-us/library/ms176114.aspx) o 'QUOTENAME ('Thomas', '"') '' Il primo esempio usa ''' il secondo '' 'come caratteri di citazione, entrambe le opzioni valide per' QUOTENAME' –

risposta

8

Uso PARSENAME:

declare @name sysname = quotename('foo]'); 
print @name; 
set @name = parsename(@name, 1); 
print @name; 


[foo]]] 
foo] 
+0

Funziona bene allo scopo per cui ho bisogno. Ma funziona solo per parentesi quadre e doppie virgolette. 'SELECT PARSENAME (QUOTENAME (' hello] ',' '' '), 1);' fornisce un risultato nullo (testato su SQL Server 2008 R2). –

0

In primo luogo, creare una funzione SQL:

CREATE FUNCTION dbo.[Revert_QUOTENAME](@quotedvalue As VARCHAR(8000)) 
RETURNS VARCHAR(8000) 
As 
BEGIN 
    RETURN REPLACE(SUBSTRING(@quotedvalue, 2, LEN(@quotedvalue) - 2), ']]', ']') 
END 

Poi,

declare @name nvarchar(50) = 'hello]' 

select 
    case 
     when [Revert_QUOTENAME](QUOTENAME(@name)) = @name then 1 
     else 0 
    end 
0

È possibile utilizzare caso in cui la logica per rimuovere le virgolette o parentesi.

DECLARE @yourTable TABLE (names VARCHAR(15)); 
INSERT INTO @yourTable VALUES('hello]'),('[hello]]'),('"hello]"'); 

SELECT names AS QuotenameVal, 
     CASE 
      WHEN LEFT(names,1) = '"' 
       AND RIGHT(names,1) = '"' 
       THEN SUBSTRING(names,2,LEN(names) - 2) 
      WHEN LEFT(names,1) = '[' 
       AND RIGHT(names,1) = ']' 
       THEN SUBSTRING(names,2,LEN(names) - 2) 
      ELSE names 
     END Actual_Value 
FROM @yourTable 

Risultati:

QuotenameVal Actual_Value 
--------------- --------------- 
hello]   hello] 
[hello]]  hello] 
"hello]"  hello] 
0

Codice;

ALTER FUNCTION [dbo].[funObtenerSinQuoteName] 
(@vchrCadena VARCHAR(8000) , @vchrQuoteNameIni CHAR(1),@vchrQuoteNameFin CHAR(1)) 

RETURNS VARCHAR(8000) AS 
BEGIN 
    DECLARE @vchrSubCadena VARCHAR (8000), @intCharIndexIni INT,@intCharIndexFin INT 

    SET @intCharIndexIni=CHARINDEX(@vchrQuoteNameIni,@vchrCadena,0) 
    SET @intCharIndexFin=CHARINDEX(@vchrQuoteNameFin,@vchrCadena,0) 
    SET @vchrSubCadena=LTRIM(RTRIM(SubString(@vchrCadena,@intCharIndexIni+1,@[email protected]))) 

    RETURN @vchrSubCadena 
END 
+1

Ti suggerisco di migliorare il tuo esempio leggendo [Esempio minimo, completo e verificabile] (http://stackoverflow.com/help/mcve). – IlGala

Problemi correlati