2015-05-18 6 views
7

W SQL Server jest wbudowana funkcja, która cytuje identyfikator o nazwie QUOTENAME. Czy istnieje funkcja, która działa odwrotnie i ponownie usuwa cytaty?Co jest przeciwieństwem funkcji QUOTENAME?

Innymi słowy, co mam zastąpić SOMEFUNCTION w poniższym przykładzie kodu, aby uzyskać zwrot 1 dla każdej wartości, na którą mogę zainicjować @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 powinieneś naprawdę odpowiedź tym, łącznie z kodem i link. – Alexander

+0

Co powiesz na ['QUOTENAME ('Thomas', '' '')'] (https://msdn.microsoft.com/en-us/library/ms176114.aspx) lub 'QUOTENAME ('Thomas', '"') '? Pierwszy przykład używa' '' 'drugiego' '' jako znaków cudzysłowu, obie ważne opcje dla 'QUOTENAME' –

Odpowiedz

8

Zastosowanie PARSENAME:

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


[foo]]] 
foo] 
+0

Działa dobrze w tym celu, dla którego go potrzebuję. Ale działa tylko w nawiasach kwadratowych i podwójnych cudzysłowach. "WYBIERZ PARSENAME (QUOTENAME (" cześć ")," ""), 1); daje wynik zerowy (testowany na SQL Server 2008 R2). –

0

Najpierw należy utworzyć funkcję SQL:

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

Następnie

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

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

Można użyć przypadek, gdy logika usunąć cytaty lub nawiasy.

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 

Wyniki:

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

kodu;

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

Proponuję poprawić swój przykład, czytając przykład [Minimalny, kompletny i weryfikowalny] (http://stackoverflow.com/help/mcve). – IlGala