2016-12-20 3 views
2

Ich versuche, eine gespeicherte Prozedur zu schreiben, die zwei Parameter akzeptiert: Tabellenname und Datensatz-ID.Konvertierung fehlgeschlagen beim Konvertieren des Varchar-Werts in den Datentyp int - aber ich konvertiere nichts

Es muss einen Datensatz mit einer angegebenen ID (@FormID) aus der Tabelle mit dem angegebenen Namen (@TableName) zurückgeben.

ich diesen Fehler:

Conversion failed when converting the varchar value 'SELECT * FROM [Form12_AuditLog] WHERE [FormID] = ' to data type int."

ich nicht wirklich das Problem verstehen, weil ich nicht zu konvertieren, etwas zu Datentyp int versuchen.

Die Parameter für die SQL übergeben werden:

@FormID = 88 
@TableName = Form12_AuditLog 

SQL:

USE [MyDatabase] 
GO 
/****** Object: StoredProcedure [dbo].[GetAuditLogByFormID] Script Date: 20/12/2016 5:50:53 PM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[GetAuditLogByFormID] 
    @TableName varchar(50), 
    @FormID integer 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @ActualTableName AS varchar(255) 

    SELECT @ActualTableName = QUOTENAME(TABLE_NAME) 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_NAME = @TableName 

    DECLARE @sql AS NVARCHAR(MAX) 
    SELECT @sql = 'SELECT * FROM ' + @ActualTableName + ' WHERE [FormID] = ' + @FormID + ';' 

    EXEC(@sql) 
END 

Antwort

5

Versuchen:

SELECT @sql = 'SELECT * FROM ' + @ActualTableName + ' WHERE [FormID] = ' + CONVERT(NVARCHAR,@FormID) + ';' 

SQL versucht, alle Saiten konvertieren Sie versuchen, in INT Werte verketten, weil @FormID einist 210 und Sie verwenden den Operator + - das ist ziemlich üblich, wenn Werte verkettet werden, die eine Mischung aus String- und Nicht-String-Typen sind. Sie müssen daher SQL explizit mitteilen, dass der Wert INT als String-Wert für die Zwecke der Verkettung behandelt werden soll.

3

Das Problem liegt daran, dass Sie eine Integer-Variable (@FormId) in eine NVARCHAR-Zeichenfolge übergeben.

Ändern Sie den "SELECT @sql" Linie sein:

SELECT @sql = 'SELECT * FROM ' + @ActualTableName + ' WHERE [FormID] = ' + CAST(@FormID AS VARCHAR(20)) + ';' 

und es sollte funktionieren.

2

Einfacher Weg ist Variable als VARCHAR oder NVARCHAR zu deklarieren, wenn Sie keine mathematischen Berechnungen haben und wenn Sie diese für dynamische Abfrage verwenden.

@FormID VARCHAR(20) 
Verwandte Themen