将 varchar 值“AND ID =”转换为数据类型 int 时转换失败
Conversion failed when converting the varchar value ' AND ID =' to data type int
我在寻找如何参数化 table 名称,因此我找到了动态 sql 查询。我终于保存了 proc,但是当我执行它时出现“将 varchar 值‘AND ID =’转换为数据类型 int 时转换失败”的错误。当我尝试执行此存储过程时,我不知道出了什么问题。我觉得这一定是一个错字,但我不能说。存储的pro.
已编辑以纳入以下建议。除非我做错了,否则仍然没有运气。
-- =======================================================
-- 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
。
You can also use OBJECT_ID
to check for table existence, and throw an exception if there is no such object.
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
我在寻找如何参数化 table 名称,因此我找到了动态 sql 查询。我终于保存了 proc,但是当我执行它时出现“将 varchar 值‘AND ID =’转换为数据类型 int 时转换失败”的错误。当我尝试执行此存储过程时,我不知道出了什么问题。我觉得这一定是一个错字,但我不能说。存储的pro.
已编辑以纳入以下建议。除非我做错了,否则仍然没有运气。
-- =======================================================
-- 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
。
You can also use
OBJECT_ID
to check for table existence, and throw an exception if there is no such object.
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