Я создал хранимую процедуру при выполнении без ошибок, но запустил ее вручную, она показывает ошибку

#sql #sql-server #sql-server-2008 #stored-procedures

#sql #sql-server #sql-server-2008 #хранимые процедуры

Вопрос:

Я создал одну хранимую процедуру; она выполнена успешно, но при выполнении вручную она показывает ошибку.

Вот мой сохраненный процесс

 USE [chandru]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
alter procedure [dbo].[Insert_BandWidthDetails]          
@CurrentState nvarchar(50),@Process nvarchar(100),@DateTime nvarchar(100),@IPaddress nvarchar(50),@UploadedBytes nvarchar(max),@DownloadedBytes nvarchar(max),@Duration nvarchar(200),@FileSize nvarchar(max),@StreamId nvarchar(100),@PlayerId nvarchar(100),
@UserName nvarchar(200),@UserId nvarchar(200),@CountryName nvarchar(100),@RegionName nvarchar(100),@Latitude nvarchar(100),@Longitude nvarchar(100),@City nvarchar(100)           
as          
begin    


declare @Sql nvarchar(max)     

set @Sql='declare @countbandwidthtable int  select @countbandwidthtable=COUNT(*) from BandWidth' @UserName @UserId 
    'if(@countbandwidthtable>0)
    begin
        declare @count int  select @count=COUNT(*) from BandWidth' @UserName @UserId ' where CurrentState=''' @CurrentState ''' and Process=''' @Process ''' and DateTime=''' @DateTime ''' and IPaddress=''' @IPaddress ''' and UploadedBytes=''' @UploadedBytes ''' and DownloadedBytes=''' @DownloadedBytes ''' and Duration=''' @Duration ''' and FileSize=''' @FileSize ''' and StreamId=''' @StreamId ''' and PlayerId=''' @PlayerId ''' and UserName=''' @UserName ''
         'if(@count=0)          
        begin          
            insert into BandWidth' @UserName @UserId ' values(''' @CurrentState ''',''' @Process ''',''' @DateTime ''',''' @IPaddress ''',''' @UploadedBytes ''',''' @DownloadedBytes ''',''' @Duration ''',''' @FileSize ''',''' @StreamId ''',''' @PlayerId ''',''' @UserName ''',''' @CountryName ''',''' @RegionName ''',''' @Latitude ''',''' @Longitude ''',''' @City ''')       
        end         
    end
else
    begin
        select * into BandWidth'  @UserName  cast(@UserID as nvarchar(max))  ' from BandWidthSample where 1=2
       insert into BandWidth' @UserName @UserId ' values(''' @CurrentState ''',''' @Process ''',''' @DateTime ''',''' @IPaddress ''',''' @UploadedBytes ''',''' @DownloadedBytes ''',''' @Duration ''',''' @FileSize ''',''' @StreamId ''',''' @PlayerId ''',''' @UserName ''',''' @CountryName ''',''' @RegionName ''',''' @Latitude ''',''' @Longitude ''',''' @City ''')      
    end '     
 exec(@Sql)
end
  

После выполнения этой хранимой процедуры команда выполнена успешно, и теперь я вставляю:

 Insert_BandWidthDetails 'stream','play','11:17:00','10.0.3.0','12344','1234','2.09','22','1','11223','sample','31','india','asd','23','23','chennai'
  

Я получаю ошибку

Сообщение 102, уровень 15, состояние 1, строка 1
Неправильный синтаксис рядом с ‘>’.
Сообщение 102, уровень 15, состояние 1, строка 5
Неправильный синтаксис рядом с ‘stream’
Сообщение 105, уровень 15, состояние 1, строка 11
Незакрытая кавычка после символьной строки ‘) end’.

Я не знаю, как устранить эту ошибку, я не нашел никакой ошибки рядом с ‘>’ этим символом, можете ли вы, ребята, помочь мне устранить эту ошибку?

Комментарии:

1. Закомментируйте инструкцию exec (@sql) и добавьте инструкцию print @Sql. Ваше заявление будет напечатано в окне сообщения. Скопируйте инструкцию и попробуйте запустить ее в новом окне запроса. Вы должны быть в состоянии легко увидеть синтаксическую ошибку, особенно если вы используете intellisense.

Ответ №1:

Помимо дизайна, в котором у вас есть одна таблица на пользователя, ваша проблема заключается в том, что в первой строке SQL нет пробела перед оператором IF. Если вы хотите, чтобы разрывы строк были в SQL, тогда вам нужно добавить CHAR(10) и не иметь разрывы строк непосредственно в коде.

Если вы сохраняете динамический SQL, я бы предложил переформатировать его в оператор set следующим образом:

 set @Sql='declare @countbandwidthtable int'   CHAR(10)   
         'select @countbandwidthtable=COUNT(*) from BandWidth'   @UserName   @UserId   CHAR(10)  
         'if(@countbandwidthtable>0)'   CHAR(10)  
           'begin'   CHAR(10)  
             'declare @count int'   CHAR(10)  
             'select @count=COUNT(*) from BandWidth' @UserName @UserId ' where CurrentState=''' @CurrentState ''' and Process=''' @Process ''' and DateTime=''' @DateTime ''' and IPaddress=''' @IPaddress ''' and UploadedBytes=''' @UploadedBytes ''' and DownloadedBytes=''' @DownloadedBytes ''' and Duration=''' @Duration ''' and FileSize=''' @FileSize ''' and StreamId=''' @StreamId ''' and PlayerId=''' @PlayerId ''' and UserName=''' @UserName ''   CHAR(10)  
             'if(@count=0)'   CHAR(10)  
               'begin'   CHAR(10)  
                 'insert into BandWidth' @UserName @UserId ' values(''' @CurrentState ''',''' @Process ''',''' @DateTime ''',''' @IPaddress ''',''' @UploadedBytes ''',''' @DownloadedBytes ''',''' @Duration ''',''' @FileSize ''',''' @StreamId ''',''' @PlayerId ''',''' @UserName ''',''' @CountryName ''',''' @RegionName ''',''' @Latitude ''',''' @Longitude ''',''' @City ''')'   CHAR(10)  
               'end'   CHAR(10)  
           'end'   CHAR(10)  
         'else'   CHAR(10)  
           'begin'   CHAR(10)  
             'select * into BandWidth'  @UserName  cast(@UserID as nvarchar(max))  ' from BandWidthSample where 1=2'   CHAR(10)  
             'insert into BandWidth' @UserName @UserId ' values(''' @CurrentState ''',''' @Process ''',''' @DateTime ''',''' @IPaddress ''',''' @UploadedBytes ''',''' @DownloadedBytes ''',''' @Duration ''',''' @FileSize ''',''' @StreamId ''',''' @PlayerId ''',''' @UserName ''',''' @CountryName ''',''' @RegionName ''',''' @Latitude ''',''' @Longitude ''',''' @City ''')'   CHAR(10)  
            'end'   CHAR(10)
  

Однако я бы настоятельно рекомендовал вам, если возможно, иметь только одну таблицу пропускной способности, содержащую столбцы, содержащие имя пользователя и идентификатор пользователя. Тогда вам вообще не понадобится динамический SQL.

Комментарии:

1. Это хорошая новость. Поскольку ответ решил проблему для вас, можете ли вы установить флажок рядом с ответом, чтобы будущие посетители знали, что ответ устранил проблему для вас?

2. да, конечно, я это сделал. Еще раз спасибо

Ответ №2:

Попробуйте внести это изменение:

Здесь

 declare @count int  select @count=COUNT(*) from BandWidth' @UserName @UserId ' where CurrentState=''' @CurrentState ''' and Process=''' @Process ''' and DateTime=''' @DateTime ''' and IPaddress=''' @IPaddress ''' and UploadedBytes=''' @UploadedBytes ''' and DownloadedBytes=''' @DownloadedBytes ''' and Duration=''' @Duration ''' and FileSize=''' @FileSize ''' and StreamId=''' @StreamId ''' and PlayerId=''' @PlayerId ''' and UserName=''' @UserName ''
  

Для

 declare @count int  select @count=COUNT(*) from BandWidth' @UserName @UserId ' where CurrentState=''' @CurrentState ''' and Process=''' @Process ''' and DateTime=''' @DateTime ''' and IPaddress=''' @IPaddress ''' and UploadedBytes=''' @UploadedBytes ''' and DownloadedBytes=''' @DownloadedBytes ''' and Duration=''' @Duration ''' and FileSize=''' @FileSize ''' and StreamId=''' @StreamId ''' and PlayerId=''' @PlayerId ''' and UserName=''' @UserName ''''
  

После @userName посмотрите 2 новых ‘ в конце. Это единственное изменение.
Скажите мне, сработало ли это