找不到列“dbo”或用户定义的函数或聚合“dbo.udf_RemoveHTMLTags”,或者名称不明确

时间:2013-12-17 05:36:55

标签: sql sql-server-2008 sql-function

我正在尝试创建一个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   

1 个答案:

答案 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