【问题标题】:Stored procedure with table name and values as parameters以表名和值作为参数的存储过程
【发布时间】:2015-02-23 22:24:36
【问题描述】:

我在使用存储过程插入值时遇到问题,该存储过程也将值作为参数和表名。这是我桌子的一部分:

我的桌子:

CREATE TABLE [dbo].[INGRESOLOTEMP_100]
(
    [CLIENTE_CODIGO] [SMALLINT] NOT NULL,
    [CAJA_CODIGO] [nvarchar](20) NULL,
    [CAJA_NUMERO] [SMALLINT] NOT NULL,
)

我的存储过程:

CREATE PROCEDURE [dbo].[SP_LOT_INSERTLOTEMP]
    @IDENT_TABLA NVARCHAR(10),
    @CLIENTE_CODIGO SMALLINT,
    @CAJA_CODIGO NVARCHAR(15),
    @CAJA_NUMERO SMALLINT
AS
    DECLARE @NOMBRE_TABLA NVARCHAR(40)

    SELECT 
       @NOMBRE_TABLA = 'INGRESOLOTEMP_' + CONVERT(VARCHAR(100), @IDENT_TABLA)

    SELECT 
       @CAJA_CODIGO = CONVERT(VARCHAR(20), @CAJA_CODIGO)

    DECLARE @SQL NVARCHAR(MAX)

    SET @SQL = 'INSERT into dbo.' + quotename(@NOMBRE_TABLA) + 
   ' (CLIENTE_CODIGO, CAJA_CODIGO, CAJA_NUMERO) VALUES (' +
    CONVERT(VARCHAR(20),@CLIENTE_CODIGO) + ',' + @CAJA_CODIGO + ',' + 
    CONVERT(VARCHAR(20),@CAJA_NUMERO) + 
    ')'

    EXEC sp_executesql @SQL

我的表名由一个表名+一个Id组成(每个用户都有一个)

但问题是当我执行存储过程时:

SP_LOT_INSERTLOTEMP 100, 123, 'uio123', 1

我在 SQL 中有一个错误,其值为:'uio123'

但如果我执行:

SP_LOT_INSERTLOTEMP 100, 123, 80, 1

插入是完美的,问题是我需要插入数字和文本值,甚至日期时间值。我在存储过程中实现了varchar 转换,但我还没有得到它。

任何人,有一个想法吗?

希望你能帮助我。

【问题讨论】:

  • 'uio123' 遇到什么具体错误?
  • "我的表名是由一个表名 + 一个 Id 组成的" 请注意这是一个糟糕的设计。我建议您重新考虑并尽快更改。

标签: sql-server stored-procedures


【解决方案1】:

格雷格,乔治... 谢谢,我听从了你的建议,我想我明白了:

ALTER PROCEDURE [dbo].[SP_LOT_INSERTLOTEMP]
@IDENT_TABLA NVARCHAR(10),
@CLIENTE_CODIGO SMALLINT,
@CAJA_CODIGO NVARCHAR(15),
@CAJA_NUMERO SMALLINT
AS
BEGIN
DECLARE @NOMBRE_TABLA NVARCHAR(40)
SELECT @NOMBRE_TABLA = 'INGRESOLOTEMP_' +  CONVERT(VARCHAR(100),@IDENT_TABLA)


DECLARE @SQL NVARCHAR(MAX)
SET @SQL = 'INSERT into dbo.' + @NOMBRE_TABLA    
SET @SQL += '(CLIENTE_CODIGO, CAJA_CODIGO, CAJA_NUMERO) VALUES ('
SET @SQL += CONVERT(VARCHAR(20), @CLIENTE_CODIGO) + ', '  
SET @SQL += '''' + CONVERT(VARCHAR(20), @CAJA_CODIGO) + ''', '  
SET @SQL += CONVERT(VARCHAR(20), @CAJA_NUMERO) + ')'

DECLARE @ParmDefinition nvarchar(500)
SET @ParmDefinition = '@IDENT_TABLA NVARCHAR(10), @CLIENTE_CODIGO SMALLINT, @CAJA_CODIGO NVARCHAR(15), @CAJA_NUMERO SMALLINT' 


SELECT @sql
PRINT @sql
EXEC sp_executesql @SQL, @ParmDefinition, @IDENT_TABLA, @CLIENTE_CODIGO, @CAJA_CODIGO, @CAJA_NUMERO

END

当我打印执行包含的内容时:

EXEC [SP_LOT_INSERTLOTEMP] 100, 123, 'UIO123', 6

我有这个:

INSERT into dbo.INGRESOLOTEMP_100(CLIENTE_CODIGO, CAJA_CODIGO, CAJA_NUMERO)         VALUES (123, 'UIO123', 6)

我会继续,如果我有任何问题,希望有人或你能帮助我。

谢谢。

【讨论】:

    【解决方案2】:

    问题出在 varchar 列中。注意为

    生成的语句
    EXEC SP_LOT_INSERTLOTEMP 100, 123, 'uio123', 1
    EXEC SP_LOT_INSERTLOTEMP 100, 123, 80, 1
    
    
    INSERT into dbo.[INGRESOLOTEMP_100] (CLIENTE_CODIGO, CAJA_CODIGO, CAJA_NUMERO) VALUES (123,uio123,1)
    INSERT into dbo.[INGRESOLOTEMP_100] (CLIENTE_CODIGO, CAJA_CODIGO, CAJA_NUMERO) VALUES (123,80,1)
    

    尝试取消注释 --PRINT @SQL 并查看结果语句。

    您应该提供额外的报价。试试这个:

    ALTER PROCEDURE [dbo].[SP_LOT_INSERTLOTEMP]
    @IDENT_TABLA NVARCHAR(10),
    @CLIENTE_CODIGO SMALLINT,
    @CAJA_CODIGO NVARCHAR(15),
    @CAJA_NUMERO SMALLINT
    AS
    DECLARE @NOMBRE_TABLA NVARCHAR(40)
    SELECT @NOMBRE_TABLA = 'INGRESOLOTEMP_' + CONVERT(VARCHAR(100),@IDENT_TABLA)
    SELECT @CAJA_CODIGO = CONVERT(VARCHAR(20), @CAJA_CODIGO)
    
    DECLARE @SQL NVARCHAR(MAX)
       SET @SQL = 'INSERT into dbo.' + quotename(@NOMBRE_TABLA) + 
       ' (CLIENTE_CODIGO, CAJA_CODIGO, CAJA_NUMERO) VALUES (' +
         + CONVERT(VARCHAR(20),@CLIENTE_CODIGO) +','''/*changes here*/ + @CAJA_CODIGO + ''','/*changes here*/ + 
        CONVERT(VARCHAR(20),@CAJA_NUMERO) + 
        ')'
      --PRINT   @SQL
     EXEC sp_executesql @SQL
    

    【讨论】:

      【解决方案3】:

      需要对您的程序进行一些更改;见下文:

      ALTER PROCEDURE [dbo].[SP_LOT_INSERTLOTEMP]
      @IDENT_TABLA NVARCHAR(10),
      @CLIENTE_CODIGO SMALLINT,
      @CAJA_CODIGO NVARCHAR(15),
      @CAJA_NUMERO SMALLINT
      AS
      BEGIN
      DECLARE @NOMBRE_TABLA NVARCHAR(40)
      SELECT @NOMBRE_TABLA = 'INGRESOLOTEMP_' +  CONVERT(VARCHAR(100),@IDENT_TABLA)
      SELECT @CAJA_CODIGO = CONVERT(VARCHAR(20), @CAJA_CODIGO)
      
      DECLARE @SQL NVARCHAR(MAX)
      SET @SQL = 'INSERT into dbo.' + @NOMBRE_TABLA    
      SET  @SQL += '(CLIENTE_CODIGO, CAJA_CODIGO, CAJA_NUMERO) 
      VALUES (@CLIENTE_CODIGO, @CAJA_CODIGO,  @CAJA_NUMERO)'
      
      DECLARE @ParmDefinition nvarchar(500)
      SET @ParmDefinition = '@IDENT_TABLA NVARCHAR(10), @CLIENTE_CODIGO  SMALLINT, @CAJA_CODIGO NVARCHAR(15), @CAJA_NUMERO SMALLINT' 
      
      SELECT @sql
      EXEC sp_executesql @SQL, @ParmDefinition, @IDENT_TABLA, @CLIENTE_CODIGO, @CAJA_CODIGO, @CAJA_NUMERO
      
      END
      

      【讨论】:

        猜你喜欢
        • 2013-06-11
        • 2011-09-30
        • 2016-08-23
        • 2018-11-27
        • 2022-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多