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

时间:2016-12-20 10:11:53

标签: sql sql-server

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

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

我收到此错误:

  

转换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 个答案:

答案 0 :(得分:8)

尝试:

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

SQL正在尝试将您尝试连接的所有字符串转换为INT值,因为@FormIDINT并且您正在使用+运算符 - 当连接由字符串和非字符串类型混合的值时,这很常见。因此,您需要明确告诉SQL为了连接的目的,应将INT值视为字符串类型值。

答案 1 :(得分:4)

问题是因为您将整数变量(@FormId)传递给NVARCHAR字符串。

将“SELECT @sql”行更改为:

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

它应该有用。

答案 2 :(得分:3)

如果您没有进行任何数学计算,并且使用该变量进行动态查询,则简单的方法是将变量声明为mergeVARCHAR

NVARCHAR