【问题标题】:SQL error when trying to loop in databases and create function尝试在数据库中循环并创建函数时出现 SQL 错误
【发布时间】:2019-05-20 20:24:06
【问题描述】:

我创建了一个 SQL 脚本来循环抛出数据库并创建一个函数(该函数的目的是将 RTF 转换为纯文本)。 我将创建函数的脚本放在一个变量上,并尝试使用 exec 命令执行它。

我使用了 While 循环,并将请求放在 varchar 变量上,然后,exec @command

但我收到此错误:

enter image description here

declare @Total as int

select @Total = count(*) from Temp1
declare @counter as int
set @counter = 1

declare @CurrentVal as varchar(max)
declare @command varchar(max)

while (@counter <= @Total)
begin 

select @CurrentVal = name from Temp1 where RowId = @counter
set @command=' use '+@CurrentVal+'
GO
CREATE FUNCTION dbo.fnParseTEXTRTF
(
@rtf VARCHAR(max)
)
RETURNS VARCHAR(max)
AS
BEGIN


DECLARE @Stage TABLE
(
Chr CHAR(1),
Pos INT
)

INSERT @Stage
(
Chr,
Pos
)
SELECT SUBSTRING(@rtf, Number, 1),
Number
FROM master..spt_values
WHERE Type = ''p''
AND SUBSTRING(@rtf, Number, 1) IN (''{'', ''}'')

DECLARE @Pos1 INT,
@Pos2 INT

SELECT @Pos1 = MIN(Pos),
@Pos2 = MAX(Pos)
FROM @Stage

DELETE
FROM @Stage
WHERE Pos IN (@Pos1, @Pos2)

WHILE 1 = 1
BEGIN
SELECT TOP 1 @Pos1 = s1.Pos, @Pos2 = s2.Pos
FROM @Stage AS s1
INNER JOIN @Stage AS s2 ON s2.Pos > s1.Pos
WHERE s1.Chr = ''{''
AND s2.Chr = ''}''
ORDER BY s2.Pos - s1.Pos

IF @@ROWCOUNT = 0
BREAK

DELETE
FROM @Stage
WHERE Pos IN (@Pos1, @Pos2)

UPDATE @Stage
SET Pos = Pos - @Pos2 + @Pos1 - 1
WHERE Pos > @Pos2

SET @rtf = STUFF(@rtf, @Pos1, @Pos2 - @Pos1 + 1, '''')
END

SET @Pos1 = PATINDEX(''%\cf[0123456789][0123456789 ]%'', @rtf)

WHILE @Pos1 > 0
SELECT @Pos2 = CHARINDEX('' '', @rtf, @Pos1 + 1), @rtf = STUFF(@rtf, @Pos1, @Pos2 - @Pos1 + 1, ''''), @Pos1 = PATINDEX(''%\cf[0123456789][0123456789 ]%'', @rtf)

SELECT @rtf = REPLACE(@rtf, ''\pard'', ''''), @rtf = REPLACE(@rtf, ''\par'', ''''), @rtf = case when LEN(@rtf)>0 then LEFT(@rtf, LEN(@rtf) - 1) else @rtf end

SELECT @rtf = REPLACE(@rtf, ''\b0 '', ''''), @rtf = REPLACE(@rtf, ''\b '', '''')

SELECT @rtf = STUFF(@rtf, 1, CHARINDEX('' '', @rtf), '''')


RETURN @rtf
end'
set @counter = @counter + 1  
exec  @command
end

【问题讨论】:

    标签: sql-server type-conversion sql-server-2016 rtf sql-function


    【解决方案1】:

    据我了解,该函数是正确的,主要问题是跨多个数据库执行函数创建语句的主要问题。 这里不能用GO,不是sql,是指令客户端执行范围内的所有语句 不幸的是,您不能使用 [DatabaseName].[schema].[FuncName] 创建不在当前数据库中的函数。 我可以提出这样的技术来解决问题,例如代码

    declare @funccode nvarchar(4000);
    set @funccode='CREATE FUNCTION [dbo].[fntest]
    (
    )
    RETURNS int
    AS
    BEGIN
        RETURN 1
    END;'
    
    declare @dbname nvarchar(100)='TestDatabase'
    
    declare @statement nvarchar(max) ='use '+@dbname+';
    exec (@func);'
    
    exec sp_executesql  @stmt = @statement,@params=N'@func nvarchar(4000)',@func=@funccode;
    

    想法-当当前数据库已经设置时,在 exec 语句中切换当前数据库并调用新的 exec 语句

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      • 2012-11-20
      • 2018-02-17
      • 2021-07-01
      • 2023-03-19
      • 2021-01-05
      相关资源
      最近更新 更多