如果我想做一些相对复杂的事情 - 通常由存储过程完成。是否可以使用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
但我可以在视图中执行此操作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]
是否有替代品(自动)? 任何帮助的赞赏。谢谢你 -
部分解决方案我能想到:
create view test_view as
select *
from [test_album]
union all
select 3 as id,
'Prince' as singer,
NULL as album_title
但您必须知道[test_album]
中的所有列名称,并且您不能让列[id]执行自动递增
答案 0 :(得分:3)
因此,您可能会误解view
的作用或insert
是什么。视图只是一个选择查询的包装器。它只包含一个select
语句,没有别的。 insert
将一行数据永久添加到持久表中。您给出的所需行所示的示例似乎足够有效。当然,如果它每次都是你想要的那一行,那么你不希望每次都将该行插入(甚至尝试插入)基础表
这引起了一些问题。
VIEW
身体。因此,如果 要更改并且您不想将其插入基表,则可以创建第二个表,其中包含要在视图中附加到基表的值。然后将基表和“额外值”表合并在一起,而不是单个硬编码行构造函数。