Ich habe eine gespeicherte Prozedur erstellt, während ich keinen Fehler ausführe, aber es manuell läuft, zeigt es Fehler an

Ich habe eine gespeicherte Prozedur erstellt. es wurde erfolgreich ausgeführt, aber bei manueller Ausführung zeigt es Fehler.

Hier ist meine gespeicherte proc

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 

Nach der Ausführung dieser gespeicherten Prozedur ist der Befehl erfolgreich und jetzt bin ich insert:

 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' 

Ich bekomme den Fehler

Msg 102, Stufe 15, Zustand 1, Zeile 1
Falsche Syntax in der Nähe von '>'.
Msg 102, Stufe 15, Zustand 1, Zeile 5
Falsche Syntax in der Nähe von 'stream'
Msg 105, Stufe 15, Zustand 1, Zeile 11
Unclosed Anführungszeichen nach der characterfolge ') end'.

Ich weiß nicht, wie man diesen Fehler zu löschen, fand ich keinen Fehler in der Nähe '>' dieses Symbol, können Sie Jungs helfen mir aus, um diesen Fehler zu löschen?

Neben dem Design, bei dem du eine einzelne Tabelle pro Benutzer hast, ist dein Problem, dass die erste Zeile von SQL keinen Platz vor der IF-statement hat. Wenn du Zeilenumbrüche im SQL willst, dann musst du + CHAR(10) hinzufügen und die Zeile nicht direkt im Code pausieren.

Wenn du das dynamische SQL beibehältest, würde ich vorschlagen, es neu zu formatieren, die Set-statement wie folgt:

 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) 

Allerdings würde ich Sie ermutigen, wenn möglich, nur eine einzige BandWidth-Tabelle zu haben, die Spalten enthält, die den UserName und UserId enthalten. Dann musst du kein dynamisches SQL haben.

Versuchen Sie, diese Änderung zu machen:

Hier

 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+'' 

nach

 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+'''' 

Nach @userName, schau die 2 neue 'am Ende. Es ist die einzige Veränderung. Sag mir, ob es funktioniert hat