通过从表中读取动态列值来替换字符串中的标签

问题描述 投票:0回答:1

使用 TSQL,我想通过从表中的列读取值来替换字符串中的标签。
例如。我要打电话:

DECLARE @TaskID nvarchar(10) = 'T001';
DECLARE @MyString nvarchar(100) = 'The person name is <FirstName>';
SELECT @Result = dbo.ReplaceTags(@TaskID, @TextWithTags)

然后它应该返回:

这个人的名字是Peter

假设 Peter 存储在 FirstName 列中,其中 TaskID = T001。

这就是我所拥有的:

CREATE FUNCTION ReplaceTags
(
    @TaskID nvarchar(10),
    @TextWithTags nvarchar(max)
)
RETURNS nvarchar(max) AS
BEGIN
    DECLARE @Result nvarchar(max)
    DECLARE @Tag nvarchar(30)

    DECLARE @TagStart INT;
    DECLARE @TagEnd INT;
    SET @TagStart = CHARINDEX('<', @TextWithTags) + 1;
    SET @TagEnd = CHARINDEX('>', @TextWithTags, @TagStart);
    SET @Tag = SUBSTRING(@TextWithTags, @TagStart, @TagEnd - @TagStart);

    DECLARE @ColumnName NVARCHAR(100) = QUOTENAME(@Tag); 
    DECLARE @SQL NVARCHAR(MAX) = N'SELECT @Result = ' + @ColumnName + ' FROM Tasks WHERE TaskID = @TaskID';

    EXEC sp_executesql @SQL, N'@TaskID NVARCHAR(10), @Result NVARCHAR(MAX) OUTPUT', @TaskID, @Result OUTPUT;

    SET @TextWithTags = REPLACE(@TextWithTags, '<' + @Tag + '>', @Result)

    RETURN @TextWithTags
END

测试时,我得到:

错误为:消息 557,级别 16,状态 2,第 14 行 仅功能和一些 扩展存储过程可以从函数内执行。

我了解该错误,但不知道如何修复。 有什么想法吗?

t-sql dynamic-sql
1个回答
0
投票

如果您取消透视任务表,则可以执行此操作。假设它的性能不太大的话可能还可以。当然有一种更干净、性能更好的方法来编写此代码,但这确实有效。

CREATE FUNCTION ReplaceTags
(
    @TaskID nvarchar(10),
    @TextWithTags nvarchar(max)
)
RETURNS nvarchar(max) 
AS
BEGIN 
    DECLARE @TagStart INT;
    DECLARE @TagEnd INT;
    DECLARE @Tag nvarchar(30);
    SET @TagStart = CHARINDEX('<', @TextWithTags) + 1;
    SET @TagEnd = CHARINDEX('>', @TextWithTags, @TagStart);
    SET @Tag = SUBSTRING(@TextWithTags, @TagStart, @TagEnd - @TagStart);

    DECLARE @Result nvarchar(100)
    SELECT TOP 1
        @Result = REPLACE(@TextWithTags, '<' + @Tag + '>', t.PropertyValue)
        FROM 
        (
        SELECT 
            TaskID 
            , u.PropertyName
            , u.PropertyValue
            FROM Tasks  
            UNPIVOT (PropertyValue FOR PropertyName IN ([FirstName], [LastName]) ) as u 
        ) t
        WHERE t.TaskID = @TaskID and t.PropertyName = @Tag

    RETURN @Result
END
© www.soinside.com 2019 - 2024. All rights reserved.