Geben Sie Konvertierungsprobleme in SQL server 2014 ein

Ich habe die folgende dynamische Abfrage verwendet

EXEC('SELECT COUNT(*) FROM ' + @TableName1 +' AND CONVERT(VARCHAR(10),CAST(InsertedDate AS DATE),120) = '+@InsertedDate) 

Es wird ein Fehler aufgetreten:

Konvertierung fehlgeschlagen beim Konvertieren des varchar-Wertes '2016-10-13' zum datatyp int.

Ich habe versucht, meine SQL-Abfrage zu parametrieren, aber als ich versuchte, den variablesnamen für den Tabellennamen zu verwenden, zeigte er die obige Nachricht an

Wenn ich EXEC nicht nutze, funktioniert die gleiche Abfrage:

 SELECT COUNT(*) FROM TableName WHERE CONVERT(VARCHAR(10), CAST(InsertedDate AS DATE), 120) = @InsertedDate 

Dies sind die variablestypen

 Declare @InsertedDate nvarchar(50); Declare @TableName1 nvarchar(500); 

Bin ich etwas falsch in der Syntax oder ist es überhaupt nicht möglich?

Ich werde dies mit parameterized queries tun

 DECLARE @SQL NVARCHAR(MAX)='' SET @SQL ='SELECT COUNT(*) FROM ' + Quotename(@TableName1) + ' Where CAST(InsertedDate AS DATE) = @InsertedDate' EXEC Sp_executesql @SQL, N'@InsertedDate DATETIME', @InsertedDate = @InsertedDate 

Wenige Änderungen habe ich gemacht

  • Hinzufügen Where Klausel in Ihrem Code fehlt.
  • QUOTENAME function QUOTENAME , um SQL Injection zu vermeiden
  • parametriert die Abfrage erneut, um SQL Injection zu vermeiden
  • Entfernt unnötige Convert

Sie können versuchen, Zitate wie unten hinzuzufügen

 EXEC('SELECT COUNT(*) FROM ' + @TableName1 +' AND CONVERT(VARCHAR(10),CAST(InsertedDate AS DATE),120) = '''+@InsertedDate + '') 

Andernfalls können Sie Parameter hinzufügen und diesen Parameter an sp_executesql senden

Es gibt zwei Syntax-Ausgaben

  1. Fehlende WHERE Klausel in SQL-Abfrage
  2. Du musst das @InsertedDate date in den einzelnen @InsertedDate

     EXEC('SELECT COUNT(*) FROM ' + @TableName1 +' WHERE CONVERT(VARCHAR(10),CAST(InsertedDate AS DATE),120) = '''+@InsertedDate+'''') 

Um diese Art von Problemen zu vermeiden, werde ich einfach die function Ersetzen verwenden, um Abfrage mit Parametern wie unten zu erstellen.

  DECLARE @TableName1 VARCHAR(10)='MYTABLE' , @InsertedDate VARCHAR(20)='''2016-01-01''' DECLARE @SQL NVARCHAR(MAX)='SELECT COUNT(*) FROM @TableName1 WHERE CONVERT(VARCHAR(10),CAST(InsertedDate AS DATE),120) = @InsertedDate' SELECT @SQL = REPLACE (@SQL,'@TableName1', @TableName1); SELECT @SQL = REPLACE (@SQL, '@InsertedDate', @InsertedDate); EXEC(@SQL)