UDF替换功能 - 无法识别字符串

时间:2014-11-17 20:08:14

标签: sql sql-server sql-server-2008 tsql user-defined-functions

我试图通过匹配database_tags中的名称,将'xml'fieldname中找到的名称替换为超链接。

我创建了一个简单的UDF,但它没有正确执行查询,因为它在XML fieldname中创建了重复的名称标记。

 ALTER FUNCTION [dbo].[Tags](@XML VARCHAR(MAX))
 RETURNS VARCHAR(MAX)
 AS
 BEGIN

  SELECT  @XML = REPLACE(@XML,[Name],'<a href="<a href="pagename.aspx?tag='+[name]+'">'+[name]+'</a>')
   FROM [dbo].[database_tags]
   where UploadDate >= '2014-09-01'

   RETURN @XML
   END

更新: 我设法将我的功能更新为以下内容,但该功能仅仅是识别XML字段名数据中的一个名称。

 DECLARE @N VARCHAR(MAX) 
 SELECT @N = [Name] FROM [dbo].[database_tags] 
 WHERE @XML LIKE '%'+[Name]+'%' 
 AND UploadDate >= '2014-09-01' 

 IF @N IS NOT NULL 
 BEGIN 
 SELECT  @XML = REPLACE(@XML, 
   @N, 
   '<a href="<a href="pagename.aspx?tag='+@N+'">'+@N+'</a>') 
 END 
 RETURN @XML 
 END 

如果可能,请进一步咨询。非常感谢

1 个答案:

答案 0 :(得分:1)

您可以使用游标循环遍历表中的值,用超链接替换每个名称。但是替换会迫使不必要的结果。例如,如果配置的名称是单独的字符串函数的一部分,则将用超链接替换它。

Create FUNCTION [dbo].[ReplaceTags](@XML VARCHAR(MAX)) 
RETURNS VARCHAR(MAX) 
AS 
BEGIN 

DECLARE @Name VARCHAR(MAX) 
DECLARE CUR CURSOR FAST_FORWARD FOR
SELECT name
FROM database_tags
Where UploadDate >= '2014-09-01'

OPEN CUR
FETCH NEXT FROM CUR INTO @Name
WHILE @@FETCH_STATUS = 0
BEGIN
 IF @Name IS NOT NULL 
 BEGIN 
 SELECT  @XML = REPLACE(@XML, 
   @Name, 
   '<a href="<a href="pagename.aspx?tag='+@Name+'">'+@Name+'</a>') 
 END 
FETCH NEXT FROM CUR INTO @Name
END

CLOSE CUR;
DEALLOCATE CUR;


 RETURN @XML 
 END