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