Đó là hơi muộn, nhưng dù sao, ở đây những cách thích hợp:
HTML Encode (HTML encoding = mã hóa XML):
DECLARE @s NVARCHAR(100)
SET @s = '<html>unsafe & safe Utf8CharsDon''tGetEncoded ÄöÜ - "Conex"<html>'
SELECT (SELECT @s FOR XML PATH(''))
HTML mã hóa trong một truy vấn:
SELECT
FIELD_NAME
,(SELECT FIELD_NAME AS [text()] FOR XML PATH('')) AS FIELD_NAME_HtmlENcoded
FROM TABLE_NAME
HTML-Decode:
SELECT CAST('<root>' + '<root>Test&123' + '</root>' AS XML).value(N'(root)[1]', N'varchar(max)');
Nếu bạn muốn làm đúng cách, bạn có thể sử dụng quy trình CLR lưu trữ.
Tuy nhiên, nó hơi phức tạp một chút, vì bạn không thể sử dụng System.Web-Assembly trong CLR-lưu trữ-thủ tục (vì vậy bạn không thể làm System.Web.HttpUtility.HtmlDecode (htmlEncodedStr);). Vì vậy, bạn phải viết lớp HttpUtility của riêng bạn, mà tôi sẽ không khuyên bạn nên, đặc biệt là để giải mã.
May mắn thay, bạn có thể trích xuất System.Web.HttpUtility ra khỏi mã nguồn đơn âm (.NET cho Linux). Sau đó, bạn có thể sử dụng HttpUtility mà không cần tham chiếu system.web.
Sau đó, bạn viết này CLR-Stored-Procedure:
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SqlServer.Server;
using System.Data.SqlTypes;
//using Microsoft.SqlServer.Types;
namespace ClrFunctionsLibrary
{
public class Test
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString HtmlEncode(SqlString sqlstrTextThatNeedsEncoding)
{
string strHtmlEncoded = System.Web.HttpUtility.HtmlEncode(sqlstrTextThatNeedsEncoding.Value);
SqlString sqlstrReturnValue = new SqlString(strHtmlEncoded);
return sqlstrReturnValue;
}
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString HtmlDecode(SqlString sqlstrHtmlEncodedText)
{
string strHtmlDecoded = System.Web.HttpUtility.HtmlDecode(sqlstrHtmlEncodedText.Value);
SqlString sqlstrReturnValue = new SqlString(strHtmlDecoded);
return sqlstrReturnValue;
}
// ClrFunctionsLibrary.Test.GetPassword
//[Microsoft.SqlServer.Server.SqlFunction]
//public static SqlString GetPassword(SqlString sqlstrEncryptedPassword)
//{
// string strDecryptedPassword = libPortalSecurity.AperturePortal.DecryptPassword(sqlstrEncryptedPassword.Value);
// SqlString sqlstrReturnValue = new SqlString(sqlstrEncryptedPassword.Value + "hello");
// return sqlstrReturnValue;
//}
public const double SALES_TAX = .086;
// http://msdn.microsoft.com/en-us/library/w2kae45k(v=vs.80).aspx
[SqlFunction()]
public static SqlDouble addTax(SqlDouble originalAmount)
{
SqlDouble taxAmount = originalAmount * SALES_TAX;
return originalAmount + taxAmount;
}
} // End Class Test
} // End Namespace ClrFunctionsLibrary
Và đăng ký nó:
GO
/*
--http://stackoverflow.com/questions/72281/error-running-clr-stored-proc
-- For unsafe permission
EXEC sp_changedbowner 'sa'
ALTER DATABASE YOUR_DB_NAME SET TRUSTWORTHY ON
GO
*/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[HtmlEncode]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[HtmlEncode]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[HtmlDecode]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[HtmlDecode]
GO
IF EXISTS (SELECT * FROM sys.assemblies asms WHERE asms.name = N'ClrFunctionsLibrary' and is_user_defined = 1)
DROP ASSEMBLY [ClrFunctionsLibrary]
GO
--http://msdn.microsoft.com/en-us/library/ms345101.aspx
CREATE ASSEMBLY [ClrFunctionsLibrary]
AUTHORIZATION [dbo]
FROM 'D:\username\documents\visual studio 2010\Projects\ClrFunctionsLibrary\ClrFunctionsLibrary\bin\Debug\ClrFunctionsLibrary.dll'
WITH PERMISSION_SET = UNSAFE --EXTERNAL_ACCESS --SAFE
;
GO
CREATE FUNCTION [dbo].[HtmlDecode](@value [nvarchar](max))
RETURNS [nvarchar](max) WITH EXECUTE AS CALLER
AS
-- [AssemblyName].[Namespace.Class].[FunctionName]
EXTERNAL NAME [ClrFunctionsLibrary].[ClrFunctionsLibrary.Test].[HtmlDecode]
GO
CREATE FUNCTION [dbo].[HtmlEncode](@value [nvarchar](max))
RETURNS [nvarchar](max) WITH EXECUTE AS CALLER
AS
-- [AssemblyName].[Namespace.Class].[FunctionName]
EXTERNAL NAME [ClrFunctionsLibrary].[ClrFunctionsLibrary.Test].[HtmlEncode]
GO
/*
EXEC sp_CONFIGURE 'show advanced options' , '1';
GO
RECONFIGURE;
GO
EXEC sp_CONFIGURE 'clr enabled' , '1'
GO
RECONFIGURE;
GO
EXEC sp_CONFIGURE 'show advanced options' , '0';
GO
RECONFIGURE;
*/
Sau đó, bạn có thể sử dụng nó như chức năng bình thường:
SELECT
dbo.HtmlEncode('helloäÖühello123') AS Encoded
,dbo.HtmlDecode('helloäÖühello123') AS Decoded
Bất kỳ ai chỉ sao chép bột nhão, xin lưu ý rằng vì lý do hiệu quả, bạn sẽ sử dụng
public const double SALES_TAX = 1.086;
// http://msdn.microsoft.com/en-us/library/w2kae45k(v=vs.80).aspx
[SqlFunction()]
public static SqlDouble addTax(SqlDouble originalAmount)
{
return originalAmount * SALES_TAX;
}
nếu bạn sử dụng chức năng này trong quá trình sản xuất.
Xem ở đây cho các lớp mono chỉnh sửa:
http://pastebin.com/pXi57iZ3
http://pastebin.com/2bfGKBte
Bạn cần phải xác định NET_2_0 trong các tùy chọn xây dựng
Câu trả lời dưới đây là tốt nhưng nếu những ký tự đó không có trong dữ liệu thì tôi khuyên bạn nên làm sạch dữ liệu. Nếu không thì James sẽ xuất hiện. – Lazarus
Các ký tự là chính xác trong dữ liệu và nếu tôi thay đổi dữ liệu tôi có thể phá vỡ ứng dụng cũ. Vì vậy, đó không phải là một lựa chọn. –
Nếu vấn đề của bạn nằm trong mã ASP.NET của bạn, thì cách 'thực hành tốt nhất' để xử lý việc này là sử dụng hàm Server.HtmlEncode() trong lớp ASP.NET. Về mặt kỹ thuật, bạn không được phép lưu trữ dữ liệu 'đã xử lý' trong DB của mình, bạn muốn dữ liệu thực, đơn giản ở đó, không được tùy chỉnh cho một hệ thống bản trình bày cụ thể (HTML).Nếu tại một thời điểm nào đó bạn chỉ cần văn bản thuần túy mà không có các thực thể HTML, bạn vẫn có một phiên bản sạch của nó trong DB của bạn. – Steve