Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.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 server 如何使用插入查询从参数中提供的值在表中插入数据_Sql Server - Fatal编程技术网

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,则可以使用“字符串分割”。