YJZ*_*YJZ 0 sql sql-server view insert-into
如果我想做一些相对复杂的事情——通常由存储过程完成的事情。是否可以使用 a 使其自动VIEW?
我的具体情况:
我想要输出表 = 输入表 A + 一些行输入表 B。在存储过程中,我可以先复制表 A,然后再复制INSERT INTO它,但在视图中不允许这样做。
简化示例:
输入表为[test_album],输出表 = 输入表 + 歌手王子。
--create test data
IF OBJECT_ID('[dbo].[test_album]', 'U') IS NOT NULL
DROP TABLE [dbo].[test_album]
CREATE TABLE [test_album] (
id int not null identity(1, 1) primary key,
singer VARCHAR(50) NULL,
album_title VARCHAR(100) NULL
)
INSERT INTO [test_album] (singer, album_title)
VALUES ('Adale', '19'),
('Michael Jaskson', 'Thriller')
--this can be executed as sql code or in stored proc
SELECT *
INTO [result_table]
FROM [test_album]
INSERT INTO [result_table] ([singer])
VALUES ('Prince')
select *
from [result_table]
--id singer album_title
--1 Adale 19
--2 Michael Jaskson Thriller
--3 Prince NULL
----as expected
Run Code Online (Sandbox Code Playgroud)
但是我可以INSERT INTO在视图中执行此操作。
真实案例:
其他歌手在表中 [extra_singers]
[test_album] 可能有许多其他列(或架构可能会更改),因此最好不要在代码中键入所有列名。
--create test data
IF OBJECT_ID('[dbo].[test_album]', 'U') IS NOT NULL
DROP TABLE [dbo].[test_album]
IF OBJECT_ID('[dbo].[extra_singers]', 'U') IS NOT NULL
DROP TABLE [dbo].[extra_singers]
IF OBJECT_ID('[dbo].[result_table]', 'U') IS NOT NULL
DROP TABLE [dbo].[result_table]
CREATE TABLE [test_album] (
id int not null identity(1, 1) primary key,
singer VARCHAR(50) NULL,
album_title VARCHAR(100) NULL,
many_other_columns VARCHAR(100) NULL
)
INSERT INTO [test_album] (singer, album_title)
VALUES ('Adale', '19'),
('Michael Jaskson', 'Thriller')
CREATE TABLE [extra_singers] (
[id] int not null identity(1, 1) primary key,
[name] VARCHAR(50) NULL )
INSERT INTO [extra_singers] ([name])
VALUES ('Prince'),
('Taylor Swift')
--append [extra_singers] to [test_album]
--this can be executed as sql code or in stored proc
SELECT *
INTO [result_table]
FROM [test_album]
INSERT INTO [result_table] ([singer])
SELECT [name]
FROM [extra_singers]
Run Code Online (Sandbox Code Playgroud)
有没有替代方案(即自动)?任何帮助表示赞赏。感谢你-
我能想到的部分解决方案:
create view test_view as
select *
from [test_album]
union all
select 3 as id,
'Prince' as singer,
NULL as album_title
Run Code Online (Sandbox Code Playgroud)
但是您必须知道其中的所有列名,[test_album]并且不能让 column [id] 自动递增
所以你可能误解了 a 是什么view,或者 aninsert是什么。视图只是单个选择查询的包装器。它只包含一个select语句,没有其他任何内容。一个insert永久添加数据一行到一个持久表。你给出的例子你只是联合你想要的行似乎足够有效。当然,如果它每次都是您想要的同一行,您就不会希望每次都将该行插入(甚至尝试插入)底层表中
不过,这提出了几个问题。
VIEW每次需要改变身体时都改变它。因此,如果是要改变,你不希望将其插入到基表,也许使包含要追加到视图基表中的值的第二个表。然后将基表和“额外值”表联合在一起,而不是一个单一的、硬编码的行构造函数。