我正在尝试编写一个带有两个参数的存储过程:表名和记录ID。
它必须从具有指定名称(@FormID
)的表中返回具有指定ID(@TableName
)的记录。
我收到此错误:
我无法真正理解该问题,因为我没有尝试将任何内容转换为数据类型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
值视为字符串类型的值。