2015-05-18 16 views
7

Trong SQL Server, có một hàm được tích hợp để báo giá mã định danh cho bạn được gọi là QUOTENAME. Có một chức năng mà ngược lại và loại bỏ các dấu ngoặc kép một lần nữa?Điều ngược lại với hàm QUOTENAME là gì?

Nói cách khác, tôi phải thay thế SOMEFUNCTION bằng ví dụ mã sau để làm cho nó trả về 1 cho bất kỳ giá trị nào tôi có thể khởi tạo @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 bạn thực sự cần làm cho một câu trả lời từ đó, bao gồm cả mã và liên kết. – Alexander

+0

Làm thế nào về ['QUOTENAME ('Thomas', '' '')'] (https://msdn.microsoft.com/en-us/library/ms176114.aspx) hoặc 'QUOTENAME ('Thomas', '"') '? Ví dụ đầu tiên sử dụng' ''số thứ hai' "' làm ký tự ngoặc kép, cả hai tùy chọn hợp lệ cho 'QUOTENAME' –

Trả lời

8

Sử dụng PARSENAME:

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


[foo]]] 
foo] 
+0

Hoạt động tốt cho mục đích tôi cần. Nhưng nó chỉ hoạt động cho các dấu ngoặc vuông và dấu ngoặc kép. 'CHỌN PARSENAME (QUOTENAME (' xin chào] ',' '' '), 1);' cho kết quả rỗng (được thử nghiệm trên SQL Server 2008 R2). –

0

Đầu tiên, tạo một hàm SQL:

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

Sau đó,

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

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

Bạn có thể sử dụng trường hợp khi logic để loại bỏ các dấu ngoặc kép hoặc dấu ngoặc đơn.

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 

Kết quả:

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

MÃ;

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

Tôi khuyên bạn nên cải thiện ví dụ của mình bằng cách đọc [Ví dụ tối thiểu, Toàn bộ và có thể kiểm chứng được] (http://stackoverflow.com/help/mcve). – IlGala

Các vấn đề liên quan