是否可以在没有手动 INSERT 语句的情况下使用生成的数据生成表?

Jac*_*ack 0 sql-server-2008 sql-server sqlcmd

是否可以在SQL Server 2008中使用SQLCMD创建表并生成数据并插入表中,而无需手动INSERT为每一行键入语句?

例子:

假设有 10 周(1、2、3 ... 10)和 2 个时间点(上午 11 点、下午 12 点)和 5 个场地(房间 1、房间 2 ... 房间 5)。因此总共会有 10 x 2 x 5 = 100 行。

那么,在给定 3 个数据参数(周、时间和地点)的情况下,是否有可能生成这 100 行的 SQL 语句?

+--------------------------------+
| Week    |   Time   |   Venue   |
+--------------------------------+
| 1       |  11 am   |  Room 1   |
| 1       |  12 pm   |  Room 1   |
| 1       |  11 am   |  Room 1   |
|                                |
| 10      |  12 pm   |  Room 5   |
+--------------------------------+
Run Code Online (Sandbox Code Playgroud)

Phi*_*lᵀᴹ 5

您可以使用 3 个 CTE 表达式来生成数据,然后将它们进行笛卡尔积。

测试表:

create table calendar
(
week integer,
time varchar(20),
venue varchar(20)
);
Run Code Online (Sandbox Code Playgroud)

周数:

SELECT 1 AS n
UNION ALL
SELECT n + 1 FROM weeks WHERE n < 10;
Run Code Online (Sandbox Code Playgroud)

场地:

SELECT 1 AS v
UNION ALL
SELECT v+1 FROM venues WHERE v < 5;
Run Code Online (Sandbox Code Playgroud)

次数:

SELECT '11 am' AS t
UNION
SELECT '12 pm' AS t;
Run Code Online (Sandbox Code Playgroud)

将它们放在一起以进行测试查询:

WITH weeks
AS (
SELECT 1 AS n
UNION ALL
SELECT n + 1 FROM weeks WHERE n < 10
),
venues AS (
SELECT 1 AS v
UNION ALL
SELECT v+1 FROM venues WHERE v < 5
),
times AS (
  SELECT '11 am' AS t
  UNION
  SELECT '12 pm' AS t
)
SELECT n as week, t as time, 'Room '+CAST(v AS VARCHAR) as venue
FROM weeks, venues,times
;
Run Code Online (Sandbox Code Playgroud)

转换为INSERT语句:

WITH weeks
AS (
SELECT 1 AS n
UNION ALL
SELECT n + 1 FROM weeks WHERE n < 10
),
venues AS (
SELECT 1 AS v
UNION ALL
SELECT v+1 FROM venues WHERE v < 5
),
times AS (
  SELECT '11 am' AS t
  UNION
  SELECT '12 pm' AS t
)
INSERT INTO calendar (week, time, venue)
SELECT n as week, t as time, 'Room '+CAST(v AS VARCHAR) as venue
FROM weeks, venues,times
;
Run Code Online (Sandbox Code Playgroud)