将varchar值转换为数据类型int时转换失败 - 但我没有进行任何转换

6
我正在尝试编写一个存储过程,它需要接收两个参数:表名和记录ID。它必须从指定名称的表(@TableName)中返回带有指定ID(@FormID)的记录。但是我遇到了这个错误:

转换varchar值'SELECT * FROM [Form12_AuditLog] WHERE [FormID] ='时,数据类型 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
3个回答

11

尝试:

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

由于@FormID是一个INT类型的变量,而您正在使用+运算符连接字符串,因此SQL尝试将您要连接的所有字符串转换为INT值。当连接一些混合了字符串和非字符串类型的值时,这种情况相当常见。因此,您需要明确告诉SQL,该INT值应被视为字符串类型值以用于连接操作。


4
问题出在你将一个整数变量(@FormId)传递给了一个NVARCHAR字符串。

将“SELECT @sql”这行代码改为:

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

并且它应该能够正常工作。


3

如果您没有任何数学计算,并且将其用于动态查询,那么声明变量为VARCHARNVARCHAR是一种简单的方法。

@FormID VARCHAR(20)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接