Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 创建使用单个变量将多个值插入表的过程_Sql_Sql Server - Fatal编程技术网

Sql 创建使用单个变量将多个值插入表的过程

Sql 创建使用单个变量将多个值插入表的过程,sql,sql-server,Sql,Sql Server,目标:创建一个过程,使用单个变量将多个值插入表中 挑战:我没有在同一个表中多次点击,而是创建了一个变量(@SQL)并存储了多个列(fm\u id和shdl\u id)结果,但我无法在insert语句中使用这个变量 代码: create proc abc ( @org_id numeric(10,0), @shdl_id numeric(10,0), @usr_id numeric(10,0), @tst_id numeric(10,0) ) AS BEGIN SET NOCOUNT ON DE

目标:创建一个过程,使用单个变量将多个值插入表中

挑战:我没有在同一个表中多次点击,而是创建了一个变量(
@SQL
)并存储了多个列(
fm\u id
shdl\u id
)结果,但我无法在insert语句中使用这个变量

代码

create proc abc
(
@org_id numeric(10,0),
@shdl_id numeric(10,0),
@usr_id numeric(10,0),
@tst_id numeric(10,0)
)
AS
BEGIN
SET NOCOUNT ON
 DECLARE @SQL NUMERIC(10);
 SET @SQL= (SELECT fm_id,@shdl_id FROM [dbo].[students] WHERE ORG_ID=@org_id AND shdl_id=@shdl_id AND TST_ID=@tst_id)

 INSERT INTO [USER]
 SELECT org_id,@usr_id,TST_ID,login_name,@SQL FROM [students] WHERE ORG_ID=@org_id AND shdl_id=@shdl_id AND TST_ID=@tst_id

 END
 GO
错误

Msg 213,16级,状态1,程序abc,第14行[批次起始行] 94]提供的值的列名或数量与表不匹配 定义


首先,您需要使SELECT只在变量中返回一个值。选择
@shdl\u id
没有意义,因为你已经知道了

 DECLARE @pFMID NUMERIC(10);
 SELECT @pFMID = MAX(fm_id) FROM [dbo].[students] WHERE ORG_ID=@org_id AND shdl_id=@shdl_id AND TST_ID=@tst_id);
然后,因为没有在用户表中的每一列中插入值,所以需要显式地说明要填充哪些列。将下面的x1..x5替换为真实列名(按SELECT的顺序)

正如Uueerdo指出的,第一个查询有点浪费时间,我们可以这样写:

create proc abc
(
...
)
AS
BEGIN

 INSERT INTO [USER](x1,x2,x3,x4,x5)
 SELECT org_id,@usr_id,TST_ID,login_name,fm_id FROM [students] WHERE ORG_ID=@org_id AND shdl_id=@shdl_id AND TST_ID=@tst_id
 --                                      ^^^^^
 --                                      look!
如果插入的列数与表中的列数相同,则只能将列列表保留在INSERT之外:

CREATE TABLE x(col1 INT, col2 INT);

INSERT INTO x VALUES (1,2)     -- works 
INSERT INTO x VALUES (1)       -- fails: which column should have the 1?
INSERT INTO x(col1) VALUES (1) -- works: col1 shall have the 1

首先,您需要使SELECT只在变量中返回一个值。选择
@shdl\u id
没有意义,因为你已经知道了

 DECLARE @pFMID NUMERIC(10);
 SELECT @pFMID = MAX(fm_id) FROM [dbo].[students] WHERE ORG_ID=@org_id AND shdl_id=@shdl_id AND TST_ID=@tst_id);
然后,因为没有在用户表中的每一列中插入值,所以需要显式地说明要填充哪些列。将下面的x1..x5替换为真实列名(按SELECT的顺序)

正如Uueerdo指出的,第一个查询有点浪费时间,我们可以这样写:

create proc abc
(
...
)
AS
BEGIN

 INSERT INTO [USER](x1,x2,x3,x4,x5)
 SELECT org_id,@usr_id,TST_ID,login_name,fm_id FROM [students] WHERE ORG_ID=@org_id AND shdl_id=@shdl_id AND TST_ID=@tst_id
 --                                      ^^^^^
 --                                      look!
如果插入的列数与表中的列数相同,则只能将列列表保留在INSERT之外:

CREATE TABLE x(col1 INT, col2 INT);

INSERT INTO x VALUES (1,2)     -- works 
INSERT INTO x VALUES (1)       -- fails: which column should have the 1?
INSERT INTO x(col1) VALUES (1) -- works: col1 shall have the 1

用户表是否有5列?一个变量只能包含一个值,除非该变量本身是表。另外,在
SELECT*
中也有“盲”插入(就不好而言)。实际上,为什么您甚至需要使用
@SQL
?您试图填充的查询与用于插入的查询几乎相同。为什么不直接插入。。。选择组织id、@usr\U id、TST\U id、登录名、fm\U id、@shdlid FROM…?请避免将图像用于数据/错误/代码。相反,直接将文本格式化,您的问题将更容易阅读。您的用户表有5列吗?一个变量只能包含一个值,除非该变量本身是表。另外,在
SELECT*
中也有“盲”插入(就不好而言)。实际上,为什么您甚至需要使用
@SQL
?您试图填充的查询与用于插入的查询几乎相同。为什么不直接插入。。。选择组织id、@usr\U id、TST\U id、登录名、fm\U id、@shdlid FROM…?请避免将图像用于数据/错误/代码。相反,直接将文本格式化,你的问题将更容易阅读。