2016-12-20 17 views
2

テーブル名とレコードIDの2つのパラメータをとるストアドプロシージャを作成しようとしています。varchar値をデータ型intに変換するときに変換に失敗しましたが、何も変換しません。

指定されたID(@FormID)のレコードを、指定された名前(@TableName)のテーブルから戻す必要があります。

私はこのエラーを取得する:

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

私はデータ型intに何かを変換しようとしていないよので、私は本当に問題を理解することはできません。 SQLに渡さ

パラメータは次のとおりです。

@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 

答えて

5

試してみてください。

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

SQLは、あなたがしようとしているすべての文字列を変換しようとしています@FormIDがであるため、INTの値に連結するあなたは+演算子を使用しています。これは、文字列型と非文字列型が混在した値を連結する場合にはよくあります。したがって、連結のためにINTの値を文字列型の値として扱う必要があることをSQLに明示的に伝える必要があります。

3

整数変数(@FormId)をNVARCHAR文字列に渡すため、この問題が発生します。

変化であるとライン "@sql SELECT":

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

をし、それが動作するはずです。

2

単純な方法は、数学的計算がなく、動的クエリに使用している場合は、変数をVARCHARまたはNVARCHARと宣言することです。

@FormID VARCHAR(20) 
関連する問題