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)
您可以使用 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)
归档时间: |
|
查看次数: |
309 次 |
最近记录: |