使用 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 行 仅功能和一些 扩展存储过程可以从函数内执行。
我了解该错误,但不知道如何修复。 有什么想法吗?
如果您取消透视任务表,则可以执行此操作。假设它的性能不太大的话可能还可以。当然有一种更干净、性能更好的方法来编写此代码,但这确实有效。
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