Я создал хранимую процедуру, не выполняя ошибки, но запустив ее вручную, показывая ошибку - PullRequest
0 голосов
/ 11 ноября 2011

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

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

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
Неверный синтаксис рядом с «потоком»
Msg 105, уровень 15, состояние 1, строка 11
Незакрытая кавычка после символьной строки ') end'.

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

Ответы [ 2 ]

1 голос
/ 11 ноября 2011

Помимо дизайна, в котором у вас есть одна таблица на пользователя, ваша проблема заключается в том, что в первой строке 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)

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

0 голосов
/ 11 ноября 2011

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

Здесь

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 новых 'в конце.Это единственное изменение.Скажите мне, работало ли оно

...