2013-12-17 2 views
0

Я пытаюсь создать скрипт sql и запуститься. Я вижу ошибку компилятора Не ​​могу найти ни столбца «dbo», ни определяемую пользователем функцию, ни агрегировать «dbo.udf_RemoveHTMLTags», либо имя неоднозначно. При запуске я получаю следующую ошибку. Идентификатор многочастности «# tempriskdesc.risk_id» " не может быть связан.Невозможно найти столбец «dbo» или пользовательскую функцию или совокупность «dbo.udf_RemoveHTMLTags», или это имя неоднозначно.

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

, где вы запустили пользовательский скрипт функции, он должен быть запущен сначала в базе данных. – Jade

+0

@lloyd указание колонки имя не является обязательным. Была проблема с запросом обновления правильного запрос обновления UPDATE PROJRISK SET risk_desc = # tempriskdesc.risk_desc из #tempriskdesc WHERE # tempriskdesc.risk_id = PROJRISK.risk_id – jetty

ответ

0

По крайней мере, похоже, есть тип-орто в SELECT, части INSERT при условии, что оба ВЫБРАТЬ ... INSERT и UPDATE ссылаются на таблицу PROJRISK, но SELECT вытягивается из колонки risk_descr, и UPDATE записывает столбец risk_desc. Это верно?

Даже если нет типа о в именах полей вы можете избавиться от временной таблицы и некоторые сложности за счет сокращения операцию только UPDATE заявление следующим образом:

UPDATE pr 
SET pr.risk_desc = [dbo].[udf_RemoveHTMLTags](SUBSTRING(pr.risk_desc, 1, 4000)) 
FROM PROJRISK pr 

Кроме того, любой Причина, по которой вы используете VARCHAR (4000) вместо VARCHAR (8000) или VARCHAR (MAX)? Какое поле risk_desc определено как? Возможно, СУЩЕСТВУЕТ также не нужно?

EDIT:
Практически почти всегда указывается список столбцов для инструкции INSERT. Однако, учитывая, что оператор SELECT создает такое же количество полей, как и таблица temp с одинаковыми типами данных и в том же порядке, это не является источником вашей ошибки.

EDIT 2:
Ошибка для «Идентификатор многочастности» # tempriskdesc.risk_id «не может быть связана». скорее всего, из-за отсутствия предложения FROM в вашем запросе UPDATE. Несмотря на то, что запрос технически не нужно даже временную таблицу (см выше), синтаксис должен быть:

UPDATE pr 
SET pr.risk_desc = tmp.risk_desc 
FROM PROJRISK pr 
INNER JOIN #tempriskdesc tmp 
     ON tmp.risk_id = pr.risk_id 
Смежные вопросы

 Смежные вопросы