以 table 名称和值作为参数的存储过程
Stored procedure with table name and values as parameters
我在使用以值作为参数和 table 名称的存储过程插入值时遇到问题。这是我的一部分 table:
我的table:
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
我的table名字由table名字+一个ID组成(每个用户都有一个)
但问题是当我执行存储过程时:
SP_LOT_INSERTLOTEMP 100, 123, 'uio123', 1
我在 SQL 中有错误值:'uio123'
但是如果我执行:
SP_LOT_INSERTLOTEMP 100, 123, 80, 1
插入非常完美,问题是我需要插入数字和文本值,甚至日期时间值。我在存储过程中实现了varchar
次转换,但我还没有得到。
有人有想法吗?
拜托,希望你能帮助我。
问题出在 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
需要对您的程序进行一些更改;见下文:
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
格雷格,乔治...
谢谢,我听从了你的建议,我想我明白了:
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)
我会继续,如果我有任何问题,我希望有人或你能帮助我。
谢谢。
我在使用以值作为参数和 table 名称的存储过程插入值时遇到问题。这是我的一部分 table:
我的table:
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
我的table名字由table名字+一个ID组成(每个用户都有一个)
但问题是当我执行存储过程时:
SP_LOT_INSERTLOTEMP 100, 123, 'uio123', 1
我在 SQL 中有错误值:'uio123'
但是如果我执行:
SP_LOT_INSERTLOTEMP 100, 123, 80, 1
插入非常完美,问题是我需要插入数字和文本值,甚至日期时间值。我在存储过程中实现了varchar
次转换,但我还没有得到。
有人有想法吗?
拜托,希望你能帮助我。
问题出在 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
需要对您的程序进行一些更改;见下文:
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
格雷格,乔治... 谢谢,我听从了你的建议,我想我明白了:
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)
我会继续,如果我有任何问题,我希望有人或你能帮助我。
谢谢。