Mã này về cơ bản dịch các ký tự dựa trên vị trí trong một chuỗi thành ký tự ở cùng vị trí trong chuỗi khác và nó chạy cho tất cả các hàng trong bảng.FOR XML PATH (''): Ký tự "đặc biệt"
Khi tôi chạy này (phiên bản đơn giản):
DECLARE @R char(40)
DECLARE @U char(40)
SET @R=' [email protected]#$%^&*()_+'+char(181)
SET @U=REVERSE(@R)
DECLARE @TestTable TABLE (RowID int identity(1,1) primary key, Unreadable varchar(500))
INSERT INTO @TestTable VALUES ('+µt$zw!*µsu+yt!+s$xy')
INSERT INTO @TestTable VALUES ('%*!!xµpxu!(')
INSERT INTO @TestTable VALUES ('pxpµnxrµu+yµs%$t')
;WITH CodeValues AS
(
SELECT
Number,SUBSTRING(@R,Number,1) AS R,ASCII(SUBSTRING(@U,Number,1)) AS UA
FROM Numbers
WHERE Number<=LEN(@R)
)
SELECT
t.RowID
,(SELECT
''+c.R
FROM Numbers n
INNER JOIN CodeValues c ON ASCII(SUBSTRING(t.Unreadable,n.Number,1))=c.UA
WHERE n.Number<=LEN(t.Unreadable)
FOR XML PATH('')
) AS readable
FROM @TestTable t
tôi nhận được như sau:
RowID readable
----------- ---------------------------------------
1 a simple translation
2 hello world
3 wow you ran this
Nhưng cần:
RowID readable
----------- ---------------------------------------
1 a simple translation
2 hello world
3 wow you ran this
Có cách nào, trừ REPLACE()
, để có không gian hiển thị đúng cách? Điều này cũng xảy ra trên các ngắt dòng, trong mã thực tế của tôi.
Điều này có thể được viết lại theo cách tốt hơn không? Về cơ bản tôi chỉ sử dụng FOR XML PATH('')
để ghép các giá trị hàng riêng lẻ lại với nhau.
tôi chắc chắn đây là mã thực sự của bạn, nhưng bạn thực sự nên đăng một ví dụ đơn giản hơn để minh họa cùng một vấn đề. Đó là một số tiền hợp lý của mã kỳ lạ để tiêu hóa, mặc dù vấn đề có thể sẽ đơn giản hơn rất nhiều. –
@ John Saunders, tôi ước rằng đó là "mã thực sự" của tôi, bởi vì tôi sẽ được thực hiện ngay bây giờ! Xin lỗi để nói rằng mã cuối cùng sẽ phức tạp hơn, vì đây là một phần nhỏ của một truy vấn. –