0

我试图找出一些方法来完成这个脚本。我导入了一个 excel 表,然后我需要根据这个 excel 表填充 5 个不同的表。但是对于这个例子,我只需要初始循环的帮助,然后我想我可以完成剩下的工作。

select distinct Department from IPACS_New_MasterList
where Department is not null

这为我提供了 7 个不同部门的列表。

Dep1, Dep2, Dep3, Dep4, Dep5, Dep6, Dep7

对于这些部门中的每一个,我都需要执行一些代码。

第1步:

将部门插入table_one

然后我需要保留SCOPE_IDENTITY()其余代码。

第2步

执行第二个循环(将该部门中的所有功能插入到table2.

我不确定如何在这个 select 语句循环中真正做一个 foreach 行,或者我是否需要做一些完全不同的事情。我已经查看了几个答案,但似乎无法准确找到我正在寻找的内容。

样本数据:

源表

Dep1, func1, process1, procedure1
dep1, func1, process1, procedure2
dep1, func1, process2, procedure3
dep1, func1, process2, procedure4
dep1, func1, process2, procedure5
dep1, func2, process3, procedure6
dep2, func3, process4, procedure7

我的表:

我的第一个表是上述查询中每个部门的列表。用钥匙就可以了departmentID。每个部门可以有很多职能。

我的第二个表是所有功能的列表,其中包含一个键functionID和一个外键departmentID。每个功能必须有1个部门,可以有很多流程

我的第三张表是所有进程的列表,其中包含一个键processID和一个外键functionID。每个进程必须有 1 个功能,并且可以有多个过程。

4

3 回答 3

1

如果我了解您要做什么...是的,您可以使用循环。它并没有真正被讨论过,我敢打赌我会从其他 SQL 开发人员那里得到一些反馈,这不是最佳实践。但是如果你真的需要做一个循环

DECLARE @rowcount as int
DECLARE @numberOfRows as int
SET @rowcount = 0
SET @numberOfRows = SELECT COUNT(*) from tablename --put in anything to get the number of times to loop.

WHILE @numberOfRows <= @rowcount

BEGIN

--Put whatever process you need to repeat here

SET @rowcount = @rowcount + 1
END
于 2013-06-19T20:21:37.853 回答
1

假设您设置了一个为主键设置了 IDENTITY 字段的表,您可以通过加入前一个表和源表来填充每个连续表的外键,例如:

INSERT INTO Table1
SELECT DISTINCT Department
FROM SourceTable
GO

INSERT INTO Table2
SELECT DISTINCT b.Deptartment_ID, a.Function
FROM SourceTable a
JOIN Table1 b
   ON a.Department = b.Department
GO

INSERT INTO Table3
SELECT DISTINCT b.Function_ID, a.Process
FROM SourceTable a
JOIN Table2 b
   ON a.Function = b.Function
GO

INSERT INTO Table4
SELECT DISTINCT b.Process_ID, a.Procedure
FROM SourceTable a
JOIN Table3 b
   ON a.Process = b.Process
GO
于 2013-06-19T20:39:47.770 回答
1

有两种方法可以在没有循环的情况下使用。

1)如果您的源(部门名称)中有候选键,只需将源表加入到您插入的表中

例如

INSERT INTO Department 
(Name)
SELECT DISTINCT Dep1 
FROM SOURCE;

INSERT INTO Functions 
(
   Name,
   DepartmentID)
SELECT DISTINCT
  s.Func1,
  d.DepartmentID
FROM
  source s
  INNER JOIN Department d
  on s.dep1 = d.name;


INSERT INTO
  processes 
(
    name,
    FunctionID,
    [Procedure]
)
SELECT
   s.process1,
   f.FunctionID,
   s.procedure1
FROM
  source s
  INNER JOIN Department d
  on s.dep1 = d.name
  INNER JOIN Functions f 
  on d.DepartmentID = f.departmentID
  and s.func1 = f.name;

SQL小提琴

2)如果您的源中没有候选键,那么您可以使用输出子句

例如,如果一个部门不能保证是唯一的,这将正确地找到新添加的

DECLARE @Department TABLE
(
    DepartmentID INT
)


DECLARE @Functions TABLE
(
    FunctionID INT
)



INSERT INTO Department 
(Name)
OUTPUT INSERTED.DepartmentID INTO @Department
SELECT DISTINCT Dep1 
FROM SOURCE



INSERT INTO Functions 
(
   Name,
   DepartmentID)
OUTPUT INSERTED.FunctionID INTO @FunctionID
SELECT DISTINCT
  s.Func1,
  d.DepartmentID
FROM
  source s
  INNER JOIN Department d
  on s.dep1 = d.name
  INNER JOIN @Department d2 
  ON d.departmentID = d2.departmentID;


INSERT INTO
  processes 
(
    name,
    FunctionID,
    [Procedure]
)
SELECT
   s.process1,
   f.FunctionID,
   s.procedure1
FROM
  source s
  INNER JOIN Department d
  on s.dep1 = d.name
  INNER JOIN Functions f 
  on d.DepartmentID = f.departmentID
  and s.func1 = f.name
  INNER JOIN  @Functions f2
  ON f.Functions = f2.Functions

SELECT * FROM Department;
SELECT * FROm Functions;
SELECT * FROM processes;

SQL小提琴

于 2013-06-19T20:44:00.603 回答