Sql server 如何使用插入查询从参数中提供的值在表中插入数据
我有这个表结构,我想写一个插入查询,它将从参数中提供的值向表中插入数据Sql server 如何使用插入查询从参数中提供的值在表中插入数据,sql-server,Sql Server,我有这个表结构,我想写一个插入查询,它将从参数中提供的值向表中插入数据 CREATE TABLE [dbo].[EMPLOYEE]( [ID] [int] NULL, [EMPLOYEE_NAME] [varchar](50) NULL, [DEPARTMENT_ID] [int] NULL, ) ON [PRIMARY] DECLARE @ID VARCHAR(20) = '1, 2'; DECLARE @Name VARCHAR(50) = 'Asim Asghar
CREATE TABLE [dbo].[EMPLOYEE](
[ID] [int] NULL,
[EMPLOYEE_NAME] [varchar](50) NULL,
[DEPARTMENT_ID] [int] NULL,
) ON [PRIMARY]
DECLARE @ID VARCHAR(20) = '1, 2';
DECLARE @Name VARCHAR(50) = 'Asim Asghar, Ahmad'
DECLARE @DeptID VARCHAR(20) = '5, 12';
INSERT INTO EMPLOYEE VALUES (@ID, @Name, @DeptID)
根据上面提供的数据,它应该添加4行,其中包含以下数据
1 Asim Asghar 5
2 Ahmad 5
1 Asim Asghar 12
2 Ahmad 12
希望有人能帮忙您不能一次通过一个变量同时传递多个值。脚本应如下所示,每次考虑一个人-
CREATE TABLE [dbo].[EMPLOYEE](
[ID] [int] NULL,
[EMPLOYEE_NAME] [varchar](50) NULL,
[DEPARTMENT_ID] [int] NULL,
) ON [PRIMARY]
DECLARE @ID INT = 1;
DECLARE @Name VARCHAR(50) = 'Asim Asghar';
DECLARE @DeptID INT = 5;
INSERT INTO EMPLOYEE(ID,EMPLOYEE_NAME,DEPARTMENT_ID) VALUES (@ID, @Name, @DeptID)
然后,您可以更改next person的值并再次执行INSERT脚本。从第二次执行开始,您必须以其他方式跳过表创建脚本以避免出错。问题的查询试图插入一行,使用ID和DeptID字段的字符串值。这将失败,并出现运行时错误 可以使用该语法在单个insert语句中插入多行:
INSERT INTO EMPLOYEE
VALUES
(1, 'Asim Asghar', 5),
(2, 'Ahmad', 5),
(1, 'Asim Asghar', 12),
(2, 'Ahmad', 12)
这些值可以来自参数或变量
在Employee
表中使用重复的ID和名称暗示存在问题。看起来目的是存储员工及其部门分配。否则,为什么要插入4行而不是8行以及所有可能的组合
员工
应更改为:
CREATE TABLE [dbo].[EMPLOYEE]
(
[ID] [int] primary key not null,
[EMPLOYEE_NAME] [varchar](50)
)
应添加另一个表,EmployeeAssignment
CREATE TABLE [dbo].[EMPLOYEE_ASSIGNMENT]
(
Employee_ID int not null FOREIGN KEY REFERENCES EMPLOYEE(ID),
[DEPARTMENT_ID] [int] not NULL,
PRIMARY KEY (Employee_ID,Department_ID)
)
可以使用两条INSERT
语句插入数据:
INSERT INTO EMPLOYEE
VALUES
(1, 'Asim Asghar'),
(2, 'Ahmad'),
INSERT INTO EMPLOYEE_ASSIGNMENT
VALUES
(1, 5),
(2, 5),
(1, 12),
(2, 12)
试试这个,您需要这个函数来使用动态分隔符按字符分割
CREATE FUNCTION UDF_SPLIT_BY_CHAR(@STRING VARCHAR(8000), @DELIMITER CHAR(1))
RETURNS @TEMPTABLE TABLE (S_DATA VARCHAR(8000))
AS
BEGIN
DECLARE @IDX INT=1,@SLICE VARCHAR(8000)
IF LEN(@STRING)<1 OR @STRING IS NULL RETURN
WHILE @IDX<> 0
BEGIN
SET @IDX = CHARINDEX(@DELIMITER,@STRING)
IF @IDX!=0
SET @SLICE = LEFT(@STRING,@IDX - 1)
ELSE
SET @SLICE = @STRING
IF(LEN(@SLICE)>0)
INSERT INTO @TEMPTABLE(S_DATA) VALUES(@SLICE)
SET @STRING = RIGHT(@STRING,LEN(@STRING) - @IDX)
IF LEN(@STRING) = 0 BREAK
END
RETURN
END
Declare @EMPLOYEE TABLE
(
[ID] [int] NULL,
[EMPLOYEE_NAME] [varchar](50) NULL,
[DEPARTMENT_ID] [int] NULL
)
DECLARE @ID VARCHAR(20) = '1, 2'
,@Name VARCHAR(50) = 'Asim Asghar, Ahmad'
,@DeptID VARCHAR(20) = '5, 12';
insert into @EMPLOYEE
(
[ID],[EMPLOYEE_NAME],[DEPARTMENT_ID]
)
Select a.S_DATA,b.S_DATA,c.S_DATA
from dbo.UDF_SPLIT_BY_CHAR(@id,',') a
left join dbo.UDF_SPLIT_BY_CHAR(@Name,',') b on 1=1
left join dbo.UDF_SPLIT_BY_CHAR(@DeptID,',') c on 1=1
CREATE FUNCTION UDF_SPLIT_BY_CHAR(@STRING VARCHAR(8000),@DELIMITER CHAR(1))
返回@tentable表(S_DATA VARCHAR(8000))
像
开始
声明@IDX INT=1,@SLICE VARCHAR(8000)
如果LEN(@STRING)0)
插入到@attable(S_数据)值(@SLICE)
设置@STRING=RIGHT(@STRING,LEN(@STRING)-@IDX)
如果LEN(@STRING)=0中断
终止
回来
终止
声明@EMPLOYEE表
(
[ID][int]NULL,
[EMPLOYEE_NAME][varchar](50)空,
[部门ID][int]空
)
声明@ID VARCHAR(20)='1,2'
,@Name VARCHAR(50)=“Asim Asghar,Ahmad”
,@DeptID VARCHAR(20)='5,12';
插入@EMPLOYEE
(
[ID],[EMPLOYEE\u NAME],[DEPARTMENT\u ID]
)
选择a.S\U数据、b.S\U数据、c.S\U数据
从dbo.UDF中,按字符(@id,,')拆分
左join dbo.UDF\u按1=1上的字符(@Name,,')b拆分
左join dbo.UDF_通过1=1上的_字符(@DeptID,,')c拆分_
参数既不设计也不用于保存多个值。。。您需要为每个插入设置它们。当您有一个插入时,您希望如何插入4行?您的代码尝试将字符串插入数字字段too@PanagiotisKanavos我理解,但显然我能够通过在参数中提供多个值从Select语句检索数据,所以这意味着无法在Insert查询中完成?@PanagiotisKanavos请签出此链接@DoonieDarkoo这不是您要求的。ID和DeptID的参数类型应更改为inttoo@mkRabbani所以,如果我必须添加多个值,我需要在插入一行后传递每个值,然后移动到下一行?@DoonieDarkoo可能需要解释您想要做什么,因为这些值基本上是随机的(为什么是4行而不是8行?),并且在名为Employee
的表中显示重复的ID会提示出现问题。您是否正在尝试存储员工和部门分配?这需要两个表,一个是Employee
表,另一个是EmployeeAssignment
@mkRabbani请看,我有两名员工,他们都在两个部门注册,因此我必须将这两名员工分配到这两个部门。所以我需要4行,显然是1个员工2行。把ID看作雇员代码,这是不可能提供的。@多尼达尔科奥:是的,你是正确的。如果您希望将所有值一起插入,请检查Panagiotis的答案。我明白您的意思,但问题是,我将以这种形式从开发人员处获取值(逗号分隔的多个值)可以同时插入100个或更多个值。我想将这些行插入表中。他不能在代码中应用循环,因为它会调用过程100次,导致执行所有查询的时间过长。@DoonieDarkoo没有理由循环。插入表1中的所有行,然后插入表2中的所有行。没有CSV——它们毫无意义。至于如何发送这100行,这是一个完全不同的问题。TVP是一种选择,尽管它们速度最慢。批量插入操作是最快的。在C#中,可以使用SqlBulkCopy类将行批量插入到tables@DoonieDarkoo至于,我将以这种形式从开发人员那里获取值(逗号分隔的多个)
这是开发人员必须修复的错误。您将如何处理包含逗号或点的字段?即使使用TVPs(表值参数),客户机代码也必须更改并将行作为表参数发送。在C#中,它们将作为数据表发送。这可能是旧版本SQL Server中拆分字符串最慢的方法。自SQL Server 2016和STRING_拆分以来,不再需要它。首先,将值作为字符串传递是一个坏主意,如果我像这样在@deptID中输入null,那么很容易避免这种情况@deptID VARCHAR(20)='5,12'代码>它不添加任何内容我修改了代码,现在可以传递空值。如果您使用2016或更高版本的SQL Server,则可以使用“字符串分割”。