我正在尝试创建一个sql脚本并运行。我看到编译器错误无法找到列“dbo”或用户定义的函数或聚合“dbo.udf_RemoveHTMLTags”,或者名称不明确。在运行时我得到以下错误多部分标识符“#tempriskdesc.risk_id “不能受约束。
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
go
CREATE FUNCTION [dbo].[udf_RemoveHTMLTags]
(@HTMLText VARCHAR(4000))
RETURNS VARCHAR(4000)
AS
BEGIN
DECLARE @Start INT
DECLARE @End INT
DECLARE @Length INT
SET @Start = CHARINDEX('<', @HTMLText)
SET @End = CHARINDEX('>', @HTMLText, CHARINDEX('<', @HTMLText))
SET @Length = ( @End - @Start ) + 1
WHILE @Start > 0 AND @End > 0 AND @Length > 0
BEGIN
SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '')
SET @Start = CHARINDEX('<', @HTMLText)
SET @End = CHARINDEX('>', @HTMLText, CHARINDEX('<', @HTMLText))
SET @Length = ( @End - @Start ) + 1
END
RETURN LTRIM(RTRIM(@HTMLText))
END
然后我尝试以这种方式使用该功能:
BEGIN TRY
CREATE TABLE #tempriskdesc
(risk_id INTEGER ,
risk_desc VARCHAR(4000))
INSERT INTO #tempriskdesc
SELECT
p.risk_id ,
[dbo].[udf_RemoveHTMLTags](SUBSTRING(p.risk_descr, 1, 4000))
FROM
PROJRISK p
UPDATE PROJRISK
SET risk_desc = #tempriskdesc.risk_desc
WHERE #tempriskdesc.risk_id = PROJRISK.risk_id
DROP TABLE #tempriskdesc
END TRY
BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000) ,
@ErrorSeverity INTEGER ,
@ErrorState INTEGER ,
@ErrorNumber INTEGER;
SELECT @ErrorMessage = ERROR_MESSAGE() ,
@ErrorSeverity = ERROR_SEVERITY() ,
@ErrorState = ERROR_STATE() ,
@ErrorNumber = ERROR_NUMBER();
RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState );
END CATCH
答案 0 :(得分:0)
至少看起来INSERT的SELECT部分中有一个type-o,SELECT ... INSERT和UPDATE引用PROJRISK表但是SELECT正从{{1}中拉出来}列和UPDATE正在写入risk_descr
列。这是对的吗?
即使字段名称中没有type-o,您仍然可以通过将操作减少到UPDATE语句来消除临时表和一些复杂性,如下所示:
risk_desc
此外,您使用VARCHAR(4000)而不是VARCHAR(8000)或VARCHAR(MAX)的任何原因? Risk_desc字段定义为什么?也许SUBSTRING也没有必要?
编辑:
最佳做法是几乎总是为INSERT语句指定列列表。但是,鉴于SELECT语句与具有相同数据类型且顺序相同的临时表生成相同数量的字段,因此这不是错误的来源。
编辑2:
“多部分标识符”#tempriskdesc.risk_id“的错误无法绑定。”很可能是由于在UPDATE查询中缺少FROM子句。虽然该查询在技术上甚至不需要临时表(见上文),但语法应该是:
UPDATE pr
SET pr.risk_desc = [dbo].[udf_RemoveHTMLTags](SUBSTRING(pr.risk_desc, 1, 4000))
FROM PROJRISK pr