我具有这种表结构,我想编写插入查询,该查询将从参数中提供的值向表中插入数据
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
希望有人可以提供帮助
答案 0 :(得分:1)
您不能一次将多个值一起通过一个变量传递。该脚本应如下所示一次考虑一个人-
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)
然后,您可以更改下一个人的值,然后再次执行INSERT脚本。从第二次执行开始,您必须跳过Table创建脚本,否则会出错。
答案 1 :(得分:0)
该问题的查询试图使用ID和DeptID字段的字符串值插入单行。这将因运行时错误而失败。
一个人可以使用table value constructor语法在单个INSERT语句中插入多行:
INSERT INTO EMPLOYEE
VALUES
(1, 'Asim Asghar', 5),
(2, 'Ahmad', 5),
(1, 'Asim Asghar', 12),
(2, 'Ahmad', 12)
值可以来自参数或变量。
在Employee
表中使用重复的ID和名称提示存在问题。看起来其目的是存储员工及其部门的工作。否则,为什么要使用所有可能的组合插入 4 行而不是 8 ?
Employee
应该更改为此:
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)
答案 2 :(得分:0)
尝试一下,您需要此功能才能使用动态定界符按char进行分割。
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