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



我正在尝试编写一个采用两个参数的存储过程:表名和记录 ID。

它必须从具有指定名称(@TableName)的表中返回具有指定ID的记录(@FormID)。

我收到此错误:

将 varchar 值"从 [Form12_AuditLog] 选择 * FROM [] 其中 [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

尝试:

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

SQL 正在尝试将您尝试连接的所有字符串转换为INT值,因为@FormID是一个INT并且您使用的是+运算符 - 这在连接字符串和非字符串类型的混合值时很常见。因此,您需要显式告诉 SQL,出于串联的目的,应将INT值视为字符串类型值。

问题是因为你正在将一个整数变量(@FormId)传递到NVARCHAR字符串中。

将"选择@sql"行更改为:

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

它应该有效。

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

@FormID VARCHAR(20)

相关内容

最新更新