Si je veux faire quelque chose de relativement compliqué - quelque chose d'habitude fait par une procédure stockée. Est-il possible de le rendre automatique en utilisant un VIEW
?utilisez INSERT dans la définition de VIEW: CREATE VIEW AS INSERT IN
Mon cas particulier:
Je veux tableau output = table d'entrée A + une table de saisie de lignes B. Dans une procédure stockée, je peux faire une copie du tableau A, puis INSERT INTO
, mais ce n'est pas autorisé dans une vue.
exemple simplifié:
table d'entréeest [test_album]
, et une table de sortie = table d'entrée + chanteur Prince.
--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
Mais je peux le faire INSERT INTO
l'intérieur d'une vue.
cas réel:
chanteurs supplémentaires sont dans une table [extra_singers]
[test_album] peut avoir beaucoup d'autres colonnes (ou schéma peut changer) il est donc pas idéal pour saisir toutes les colonnes noms dans le code.
--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]
Existe-t-il une alternative à cela (c'est automatique)? toute aide est appréciée. Merci u-
une solution partielle je peux penser:
create view test_view as
select *
from [test_album]
union all
select 3 as id,
'Prince' as singer,
NULL as album_title
mais vous devez connaître tous les noms de colonnes dans [test_album]
et vous ne pouvez pas laisser la colonne [id] faire auto -increment
Cela n'a aucun sens. Pouvez-vous clarifier? – SqlZim
Les vues sont censées afficher les données sous-jacentes. L'insertion ne serait pas vraiment appropriée pour cela. Une procédure stockée serait mieux adaptée à ce que vous essayez de faire si vous ne voulez pas insérer les données directement. – indiri
@SqlZim Je dois ajouter une ligne à une table chaque fois que je l'utilise. J'essaie d'automatiser ceci en utilisant 'VIEW'. Donc, la vue devrait = table d'entrée + une ligne supplémentaire –