2017-10-20 14 views
0

비교적 복잡한 작업을 수행하려면 저장 프로 시저에서 일반적으로 수행해야합니다. VIEW을 사용하여 자동으로 만들 수 있습니까?보기의 정의 내부에 INSERT를 사용하십시오. CREATE VIEW AS INSERT INTO

내 특정 경우 :

I 출력이 테이블 = 입력 테이블은 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]를 할 수 없습니다 : 내가 생각할 수있는


부분적인 해결책 U- 감사 -increment

+1

이것은 의미가 없습니다. 당신은 명확히 할 수 있습니까? – SqlZim

+2

뷰는 기본 데이터를 표시하기위한 것입니다. 삽입은 실제로 그렇게 적합하지 않습니다. 저장 프로시 저는 데이터를 직접 삽입하지 않으려는 경우 수행하려는 작업에 더 적합합니다. – indiri

+0

@SqlZim 테이블을 사용할 때마다 테이블에 행을 추가해야합니다. VIEW를 사용하여 자동화하려고합니다. 그래서보기는 = 입력 테이블 + 하나의 여분의 행을해야합니다 –

답변

3

따라서 view이 무엇인지 또는 insert이 무엇인지 오해하고있을 수 있습니다. 뷰는 단일 선택 쿼리를 둘러싼 단순한 래퍼입니다. 정확히 하나의 select 문을 포함하고 다른 것은 없습니다. insert은 영구 테이블에 데이터 행을 영구적으로 추가합니다. 원하는 행을 합치는 곳에서 지정한 예제는 충분히 유효합니다. 그리고 매번 원하는 행과 같으면 매번 기본 행에 해당 행을 삽입 (또는 심지어 삽입하려고 시도)하고 싶지는 않습니다.

이렇게하면 몇 가지 질문이 제기됩니다.

  • 항상 동일한 단일 행을 조합 할 때마다 테이블에 행을 추가하지 않으시겠습니까?
  • 기본 테이블의 해당 행을 원하지 않는다면 차갑게 말하십시오. 그러나 항상 정적 인 값이라면 왜 그것을 뷰에 포함시켜야합니까? 그냥 거기 있다고 추측 할 수 없습니까?
  • 언제나 동일하다고 가정 할 수 없으면 변경해야 할 때마다 VIEW 본문을 변경하고 싶지는 않습니다.따라서 이 변경 될 경우이 변경되고 기본 테이블에 삽입하지 않으려면보기의 기본 테이블에 추가 할 값이 들어있는 두 번째 테이블을 만들 수 있습니다. 그런 다음 하드 코딩 된 행 생성자 대신 기본 테이블과 "추가 값"테이블을 함께 결합합니다.
+0

감사합니다 @ Xedni - 나를 위해 많은 명확히! 필자의 실제 사례는'output table' ='table A' +'table B'에 기초한 몇 개의 추가 행이다. 동료는'테이블 A '와'테이블 B '를 업데이트 할 수 있으며 자동으로 만들어서 때때로 추가 할 필요가 없습니다. –