2010-09-06 3 views
1

У меня возникли проблемы с этой хранимой процедурой, не могли бы вы помочь.SQL Server: ошибка в Cursorless хранимой процедуре

Это ошибка, которую я получаю - запуск всего этого через разработчика Oracle Sql на SQL Server 2000, размещенном в другом месте.

Ошибка
Error starting at line 1 in command:
execute dbo.OF_ASEQ_EH_BROWNBIN 'dbo.EH_Brownbin_Josh','Match', 1
Error report:
Incorrect syntax near the keyword 'BEGIN'.

Процедура

ALTER PROCEDURE [dbo].[OF_ASEQ_EH_BROWNBIN] 
@JvarTable Varchar(250), 
@varColumn Varchar(250), 
@optInterval int 
AS 


declare @Sql_string nvarchar(4000) 
declare @myERROR  int 
declare @myRowCount int 



declare @topseed  int 
declare @stg_topseed varchar(100) 


-- Temp table for rows with nulls in specific column 


declare @RowCnt  int 
declare @MaxRows  int 
declare @col_Name  nvarchar(250) 
declare @col_UPRN  nvarchar(250) 
declare @col_JoinedOn smalldatetime 

begin 

set @Sql_string = 'select top 1 ' + @varColumn + ' from ' + @JvarTable + ' order by convert(int, ' + @varColumn + ') desc' 
set @stg_topseed = @Sql_string 
set @topseed = convert(int, @stg_topseed) 



SELECT @myERROR = @@ERROR, @myRowCOUNT = @@ROWCOUNT 
IF @myERROR != 0 GOTO HANDLE_ERROR 



select @RowCnt = 1 

declare @Import table 
( 
rownum int IDENTITY (1, 1) Primary key NOT NULL , 
col_Name nvarchar(250), 
col_UPRN nvarchar(250), 
col_JoinedOn smalldatetime 
) 

set @sql_string = 'insert into @Import (col_Name, col_UPRN, col_JoinedOn) select Name, UPRN, JoinedOn from ' + @JvarTable + ' where ' + @varColumn +' is null' 
exec @Sql_string 

SELECT @myERROR = @@ERROR, @myRowCOUNT = @@ROWCOUNT 
IF @myERROR != 0 GOTO HANDLE_ERROR 

select @MaxRows=count(*) from @Import 

SELECT @myERROR = @@ERROR, @myRowCOUNT = @@ROWCOUNT 
IF @myERROR != 0 GOTO HANDLE_ERROR 

-- Next new seed 
select @topseed = @topseed + @optInterval 
<br/> 
while @RowCnt <= @MaxRows 
    begin 
    select @col_Name = col_Name from @Import where rownum = @RowCnt 
    select @col_UPRN = col_UPRN from @Import where rownum = @RowCnt 
    select @col_JoinedOn = col_JoinedOn from @Import where rownum = @RowCnt 

    set @Sql_string = 'update ' + @JvarTable + ' set ' + @varColumn + ' = cast((' + @topseed + ') as char) where Name = ''' + @col_Name + ''' and UPRN = ''' + @col_UPRN + ''' and JoinedOn = ''' + @col_JoinedOn + ''' ' 
    exec (@Sql_string) 

    select @topseed = @topseed + @optInterval 
    Select @RowCnt = @RowCnt + 1 
    end 

SELECT @myERROR = @@ERROR, @myRowCOUNT = @@ROWCOUNT 
IF @myERROR != 0 GOTO HANDLE_ERROR 

HANDLE_ERROR: 
RETURN @myERROR 

end 
+0

Может немного очистить ваш код; трудно сказать, как выглядит форматирование. Возможно, у вас есть BEGIN и SET на одной строке, или это может быть опечатка. Он также может быть первым предложением ORDER BY, но, как вы его показывали, это довольно грязно. – LittleBobbyTables

+0

Код теперь более аккуратный - Большое спасибо @Martin Smith. Спасибо @LittleBobbyTables за это. Кто-нибудь управляет выяснением, почему я все еще получаю ошибку BEGIN? Благодарю. – Joshua

ответ

0

Я делал домашнее хозяйство на StackOverflow, и понял, что я не имел (или принят) ответил на вопрос, который я задал давно.Я не мог вспомнить, какой метод/порядок работы я решил, но я чувствовал, что важно загрузить мой принятый и рабочий сценарий, хотя мне он больше не нужен.

Тем не менее, я искренне надеюсь, что этот код поможет следующему человеку, у которого есть похожий вопрос на мой.

CREATE PROCEDURE [dbo].[OF_ASEQ_EH_BROWNBIN] @JvarTable nvarchar(250), @varColumn nvarchar(250), @optInterval int AS 
/* 
Procedure OF_ASEQ_EH_BROWNBIN 
Created by Joshua White 
When  20100902 

Purpose  To fill up column with new sequence numbers 
Arguments JvarTable - Table name 
      varColumn - Column name 
      optInterval - Steps in increment in building new sequence (Should be 1 (one)) 

Example script to begin procedure 

EXECUTE [dbo].[OF_ASEQ_EH_BROWNBIN] 'EH_Brownbin_Josh', 'Match', 1 

PLEASE NOTE - Typically Stored Procedures are supposed to be flexible to work on 
any tables, but due to complications with SQL Server 2000 and problems with 
Cursors, we have to use manual scripts and this Stored Procedure will only work 
on EH_BrownBin table ONLY. 

Any questions about this, please send email to 
<email deleted> 
*/ 

declare @Sql_string nvarchar(4000) 
declare @myERROR  int  
declare @myRowCount int 

/* Fetching the last number in rows of table in question */ 
declare @topseed  int 
declare @stg_topseed varchar(100) 

-- Temp table for rows with nulls in specific column 
declare @RowCnt  int 
declare @MaxRows  int 
declare @rc   int 
declare @colu_Name  nvarchar(250) 
declare @colu_UPRN  nvarchar(250) 
declare @colu_JoinedOn smalldatetime 

Begin 
    set @stg_topseed = 'select top 1 ' + @varColumn + ' from ' + @JvarTable + ' order by convert(int, ' + @varColumn + ') desc' 
    exec (@stg_topseed) 

/* Begin collecting all rows with nulls in specified column */ 
select @RowCnt = 1 

declare @Import table 
(
    rownum int IDENTITY (1, 1) Primary key NOT NULL , 
    colu_Name nvarchar(250), 
    colu_UPRN nvarchar(250), 
    colu_JoinedOn smalldatetime 
) 
set nocount on 
select @MaxRows = count(*) from @Import 

-- Next new seed 
select @stg_topseed = @stg_topseed + @optInterval 
select @rc=0 

while @RowCnt <= @MaxRows 
    begin 
    select @colu_Name = colu_Name from @Import where rownum = @RowCnt 
    select @colu_UPRN = colu_UPRN from @Import where rownum = @RowCnt 
    select @colu_JoinedOn = colu_JoinedOn from @Import where rownum = @RowCnt 

    set @Sql_string = 'update ' + @JvarTable + ' set ' + @varColumn + ' = ' + @stg_topseed + ' where Name = ''' + @colu_Name + ''' and UPRN = ''' + @colu_UPRN + ''' ' 
    exec (@Sql_string) 
    select @stg_topseed = @stg_topseed + @optInterval 
    Select @RowCnt = @RowCnt + 1 
    end 

print 'END' 
end 
0

В то время как в Oracle, вам нужно иметь DECLARE - BEGIN - END, в MSSQL вы не должны использовать НАЧАТЬ/END ключевые слова на теле процедуры.

Обратите внимание, что ярлык HANDLE_ERROR: находится вне BEGIN/END.

Я предполагаю, что удаление BEGIN (после блока DECLARE) и END (до SELECT @myERROR = ...) ошибка исчезнет.

Edit:

Я предполагаю, что я не получаю следующее заявление:

set @Sql_string = 'select top 1 ' + @varColumn + ' from ' + @JvarTable + ' order by convert(int, ' + @varColumn + ') desc' 
set @stg_topseed = @Sql_string 
set @topseed = convert(int, @stg_topseed) 

Вы назначаете строку вар, скопировать значение в другой строки вар, и вместо выполнения инструкции SQL , вы передаете строку var в int. (?)

+0

Проблема заключается в первоначальной настройке таблицы - есть столбец с последовательными номерами, но в строчном формате, следовательно, необходимо найти самое верхнее число, а затем преобразовать его в integar, чтобы я мог добавить 1 к каждому циклу при обновлении строк с нулевыми значениями в столбце, в той же таблице. – Joshua

+0

Удалено BEGIN и END везде = такая же ошибка, поэтому я сильно угадываю, что инструмент (Oracle SQL Developer) не является наиболее подходящим для отладки новой хранимой процедуры на SQL Server 2000. Возможно, придется посетить сайт и использовать Query Analyzer на коробке. – Joshua

+0

Спасибо @Devio, я скорректировал конец до самого конца процедуры. В заключение, я думаю, что я использую неправильный инструмент для анализа запросов. – Joshua

0

В этом коде было несколько ошибок, и, вероятно, существует лучший, основанный на наборе способ решения проблемы, для которой предназначена эта хранимая процедура. (Но это еще один вопрос и требует знания целевых таблиц, которые не были предоставлены.)

Следующий код должен быть на шаг ближе к тому, что вы ищете.
Изменения:

  1. Edited подозрительный код, cast((' + @topseed + ') as char)в том, что колонка действительноchar? или это варчар (что-то)?
  2. Исправленная логика около @topseed выборка.
  3. Исправлена ​​логика вокруг использования таблицы импорта.
  4. Исправлено обновление SQL-генерации.
  5. Удалено посторонним Begin/END s.
  6. Удалено посторонний HTML (<br/>).
  7. Обернутая процедура с Begin/END.
  8. Go в конце.

Код:

ALTER PROCEDURE [dbo].[OF_ASEQ_EH_BROWNBIN] 
    @JvarTable Varchar(250), 
    @varColumn Varchar(250), 
    @optInterval int 
AS 
BEGIN 
    DECLARE @Sql_string nvarchar(4000) 
    DECLARE @myERROR  int 
    DECLARE @myRowCount int 
    DECLARE @topseed  int 
    DECLARE @stg_topseed varchar(100) 

    -- Temp table for rows with nulls in specific column 
    DECLARE @RowCnt  int 
    DECLARE @MaxRows  int 
    DECLARE @col_Name  nvarchar(250) 
    DECLARE @col_UPRN  nvarchar(250) 
    DECLARE @col_JoinedOn smalldatetime 

    SET @Sql_string  = 'select top 1 @stg_topseed = ' + @varColumn + ' from ' + @JvarTable + ' order by convert(int, ' + @varColumn + ') desc' 
    EXEC SP_EXECUTESQL @Sql_string, N'@stg_topseed varchar(100) OUTPUT', @stg_topseed OUTPUT 

    SELECT @myERROR = @@ERROR, @myRowCOUNT = @@ROWCOUNT 
    IF @myERROR != 0 GOTO HANDLE_ERROR 

    SET @topseed  = CONVERT(int, @stg_topseed) 

    /* Can't use a table variable with EXEC and/or SP_EXECUTESQL. 
     Therefore, forced to use a temporary table. 
    */ 
    IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id('#Import') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
     DROP TABLE #Import 

    CREATE table #Import 
    (
     rownum   int IDENTITY (1, 1) Primary key NOT NULL, 
     col_Name  nvarchar(250), 
     col_UPRN  nvarchar(250), 
     col_JoinedOn smalldatetime 
    ) 

    SET @sql_string = 'insert into #Import (col_Name, col_UPRN, col_JoinedOn) select Name, UPRN, JoinedOn from ' + @JvarTable + ' where ' + @varColumn +' is null' 
    EXEC (@Sql_string) 

    SELECT @myERROR = @@ERROR, @myRowCOUNT = @@ROWCOUNT 
    IF @myERROR != 0 GOTO HANDLE_ERROR 

    SELECT @MaxRows=count(*) from #Import 

    SELECT @myERROR = @@ERROR, @myRowCOUNT = @@ROWCOUNT 
    IF @myERROR != 0 GOTO HANDLE_ERROR 

    -- Next new seed 
    SELECT @topseed = @topseed + @optInterval 
    SELECT @RowCnt = 1 

    WHILE @RowCnt <= @MaxRows 
     BEGIN 
     SELECT @col_Name = col_Name from #Import where rownum = @RowCnt 
     SELECT @col_UPRN = col_UPRN from #Import where rownum = @RowCnt 
     SELECT @col_JoinedOn = col_JoinedOn from #Import where rownum = @RowCnt 

     SET @Sql_string = 'update ' + @JvarTable + ' set ' + @varColumn + ' = ''' + CAST (@topseed AS varchar(250)) + ''' where Name = ''' + @col_Name + ''' and UPRN = ''' + @col_UPRN + ''' and JoinedOn = ''' + CAST(@col_JoinedOn AS varchar(250)) + ''' ' 
     EXEC (@Sql_string) 

     SELECT @topseed = @topseed + @optInterval 
     SELECT @RowCnt = @RowCnt + 1 
     END 

    SELECT @myERROR = @@ERROR, @myRowCOUNT = @@ROWCOUNT 
    IF  @myERROR != 0 GOTO HANDLE_ERROR 

    HANDLE_ERROR: 
    RETURN @myERROR 
END 
GO 
+0

Это выглядит хорошо, я собираюсь пойти с ним. Хотя вчера я посетил сайт и работал на коробке - ошибки отличаются от тех, которые я получил через Oracle SQL Developer, - заключая, что этот инструмент определенно не является правильным инструментом для работы с SQL Server 2000 за пределами площадки. Я собираюсь дать новый код, чтобы попробовать его в следующий раз, когда я там. Большое спасибо – Joshua

+0

Быстрый вопрос к @Brock Adams - как поставить вопрос, который я поставил, так как решил, что нашел обход. Тем не менее я собираюсь дать вашему коду возможность дать вам кредит. – Joshua

+0

@ Joshua: Вы спрашиваете, как отметить этот вопрос, как ответили? Если это так, просто нажмите на полый флажок. В левом верхнем углу ответа, под стрелками голосования. Если вы спрашиваете что-то еще, я не понимаю, что это такое. –

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