将 varchar 值“AND ID =”转换为数据类型 int 时转换失败

Posted

技术标签:

【中文标题】将 varchar 值“AND ID =”转换为数据类型 int 时转换失败【英文标题】:Conversion failed when converting the varchar value ' AND ID =' to data type int 【发布时间】:2021-10-20 16:28:16 【问题描述】:

我正在寻找如何参数化表名,因此我找到了动态 sql 查询。我终于保存了过程,但是当我执行它时出现“将varchar值'AND ID ='转换为数据类型int时转换失败”的错误。当我尝试执行这个存储过程时,我不知道出了什么问题。我觉得这一定是一个错字,但我不能说。存储亲。

已编辑以纳入以下建议。除非我做错了,否则仍然没有运气。

-- =======================================================
-- Create Stored Procedure Template for Azure SQL Database
-- =======================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author, , Name>
-- Create Date: <Create Date, , >
-- Description: <Description, , >
-- =============================================
ALTER PROCEDURE [dbo].[sp_GetFormFieldCDC]
(
    @formfieldId INT,
    @C___operation INT,
    @C___start_lsn binary(10),
    @tablename NVarchar(255)

)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON

    DECLARE @ActualTableName AS NVarchar(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 __$start_lsn =' + CONVERT(NVARCHAR(255),@C___start_lsn) + ' AND __$operation =' +  @C___operation  + ' AND ID =' + @formfieldId + ';'

    -- Insert statements for procedure here
    EXEC sp_executesql @SQL, N' @formfieldId INT,
    @C___operation INT,
    @C___start_lsn binary(10),
    @tablename NVarchar(255)', @formfieldId ,
    @C___operation,
    @C___start_lsn,
    @tablename
END
GO


【问题讨论】:

使用带有sp_executesql的参数就不会发生这种情况。 另外,用QUOTENAME 正确引用您的动态对象名称;否则这是一个巨大的安全漏洞。 "我正在寻找如何参数化表名,因此我找到了动态 sql 查询。"现在你有两个问题。 最后,不要使用sp_ 作为前缀,它是微软为S特殊P程序保留的。使用它是一件性能外套,可能会导致您的程序有一天根本无法工作。 【参考方案1】:

您应该将参数一直传递sp_executesql不要注入它们,除非它们是对象名称,在这种情况下您需要 QUOTENAME

您也可以使用OBJECT_ID 来检查表是否存在,如果不存在则抛出异常。

CREATE OR ALTER PROCEDURE [dbo].[GetFormFieldCDC]
(
    @formfieldId INT,
    @C___operation INT,
    @C___start_lsn binary(10),
    @schemaname sysname,
    @tablename sysname
)
AS

    SET NOCOUNT ON;

    IF (OBJECT_ID(QUOTENAME(@schemaname) + '.' + QUOTENAME(@tablename)) IS NULL)
        THROW 50000, 'Table not found', 0;

    DECLARE @sql AS NVARCHAR(MAX) = '
SELECT *
FROM ' + QUOTENAME(@schemaname) + '.' + QUOTENAME(@tablename) + '
WHERE __$start_lsn = @C___start_lsn
  AND __$operation = @C___operation
  AND ID = @formfieldId;
';

    EXEC sp_executesql @SQL,
    N' @formfieldId INT,
       @C___operation INT,
       @C___start_lsn binary(10)',
    @formfieldId = @formfieldId,
    @C___operation = @C___operation,
    @C___start_lsn = @C___start_lsn;

GO

【讨论】:

改成这个后出现同样的错误。 这是不可能的,这段代码不会产生错误Conversion failed when converting the varchar value ' AND ID =' to data type int,因为这里没有发生隐式转换。您收到什么实际错误消息? 我的错误 - 使用了错误的 sp。效果很好,谢谢。

以上是关于将 varchar 值“AND ID =”转换为数据类型 int 时转换失败的主要内容,如果未能解决你的问题,请参考以下文章

将 varchar 值“%”转换为数据类型 int 时转换失败

如何将 varchar 列值转换为 int?

将 varchar 值转换为数据类型 int 时转换失败

将 varchar 值“A0001”转换为数据类型 int 时转换失败

将 varchar 值“Collect_Date”转换为数据类型 int 时转换失败

将 varchar 值“FOT”转换为数据类型 int 时转换失败