2013-04-24 59 views
3

當我運行下面的寫入過程時,出現以下錯誤。這有什麼問題?關鍵字'VIEW'附近的語法錯誤

錯誤:

消息156,級別15,狀態1,過程tbv21Setup,11號線不正確 關鍵字 '查看' 附近的語法。

**

CREATE PROCEDURE tbv21Setup 

AS 
BEGIN 

    CREATE VIEW Cust_Address_View AS 
     SELECT customer.individual_id individual_id, 
      customer.tb_customer_id customer_id, 
      customer.customer_category_lkp customer_category_lkp, 
      ADDRESS.postal_code postal_code 
     FROM CUSTOMER 
     INNER JOIN INDIVIDUAL 
     ON (CUSTOMER.individual_id = INDIVIDUAL.individual_id) 
     JOIN 
      (SELECT address_id , 
      a.individual_id , 
      postal_code , 
      obsolete_flag , 
      tb_modified_date 
      FROM address a 
      INNER JOIN 
      (SELECT individual_id, 
       MAX(ISNULL((tb_modified_date),('01/01/1900'))) AS max_tb_modified_date 
      FROM ADDRESS 
      WHERE obsolete_flag = 0 
      GROUP BY individual_id 
      ) AS xa 
      ON (xa.individual_id     = a.individual_id 
      AND xa.max_tb_modified_date   = ISNULL((a.tb_modified_date),('01/01/1900'))) 
      WHERE a.obsolete_flag     = 0 
     ) AS ADDRESS ON (ADDRESS.individual_id = INDIVIDUAL.individual_id) 
     AND customer.customer_category_lkp  = 
      (SELECT lookup_id 
      FROM lookup 
      WHERE lookup_category_name = 'customer_category' 
      AND code_string   ='prospect' 
     ) 
     AND customer.obsolete_flag =0 
     AND ADDRESS.postal_code NOT IN ('UNKNOWN','unknown','U','u',' ',''); 

    ALTER TABLE tb_customer_attribute 
    ADD tb_customer_attribute_id UNIQUEIDENTIFIER DEFAULT NEWID() PRIMARY KEY, 
       obsolete_flag int, 
       revision_number int; 

    CREATE TABLE tb_comm_hist_xfer (
     tb_comm_hist_xfer_id binary(16) NOT NULL, 
     tb_old_customer_id int NOT NULL, 
     tb_customer_id int NULL, 
     date_entered datetime NOT NULL 
    ); 


    --Logger table 
    CREATE TABLE TBLogger (logDate DATETIME, logSQL VARCHAR(MAX), logRows INT, errKode INT); 

    --Create a parameter table in CRB/STAGE database which will hold a row for crb/stage db prefix. 
    CREATE TABLE crb_parameter (stgdb_prefix VARCHAR(255)); 

    INSERT INTO crb_parameter values ('tommydev1.dbo'); 
    --uncomment the below line and comment the above line in PRODUCTION 
    --INSERT INTO crb_parameter values ('tb_stage.dbo'); 


END 
+1

請參閱 「http://stackoverflow.com/questions/7712702/creating-a-view-using-stored-procedure」 – 2013-04-24 06:44:16

+0

每天都學到一些東西。剛剛被這個問題困擾了,謝謝你提出這個問題。 – Spence 2013-08-23 22:11:28

回答

7

燦」 t只能批量創建sp中的DDL。否則,嘗試動態SQL -

CREATE PROCEDURE tbv21Setup 

AS 
BEGIN 

    EXEC sp_executesql N' 

    CREATE VIEW Cust_Address_View AS 
     SELECT customer.individual_id individual_id, 
      customer.tb_customer_id customer_id, 
      customer.customer_category_lkp customer_category_lkp, 
      ADDRESS.postal_code postal_code 
     FROM CUSTOMER 
     INNER JOIN INDIVIDUAL 
     ON (CUSTOMER.individual_id = INDIVIDUAL.individual_id) 
     JOIN 
      (SELECT address_id , 
      a.individual_id , 
      postal_code , 
      obsolete_flag , 
      tb_modified_date 
      FROM address a 
      INNER JOIN 
      (SELECT individual_id, 
       MAX(ISNULL((tb_modified_date),(''01/01/1900''))) AS max_tb_modified_date 
      FROM ADDRESS 
      WHERE obsolete_flag = 0 
      GROUP BY individual_id 
      ) AS xa 
      ON (xa.individual_id     = a.individual_id 
      AND xa.max_tb_modified_date   = ISNULL((a.tb_modified_date),(''01/01/1900''))) 
      WHERE a.obsolete_flag     = 0 
     ) AS ADDRESS ON (ADDRESS.individual_id = INDIVIDUAL.individual_id) 
     AND customer.customer_category_lkp  = 
      (SELECT lookup_id 
      FROM lookup 
      WHERE lookup_category_name = ''customer_category'' 
      AND code_string   =''prospect'' 
     ) 
     AND customer.obsolete_flag =0 
     AND ADDRESS.postal_code NOT IN (''UNKNOWN'',''unknown'',''U'',''u'','' '','''');' 

EXEC sp_executesql N' 

    ALTER TABLE tb_customer_attribute 
    ADD tb_customer_attribute_id UNIQUEIDENTIFIER DEFAULT NEWID() PRIMARY KEY, 
       obsolete_flag int, 
       revision_number int; 

    CREATE TABLE tb_comm_hist_xfer (
     tb_comm_hist_xfer_id binary(16) NOT NULL, 
     tb_old_customer_id int NOT NULL, 
     tb_customer_id int NULL, 
     date_entered datetime NOT NULL 
    ); 

    CREATE TABLE TBLogger (logDate DATETIME, logSQL VARCHAR(MAX), logRows INT, errKode INT); 

    CREATE TABLE crb_parameter (stgdb_prefix VARCHAR(255)); 

    INSERT INTO crb_parameter VALUES (''tommydev1.dbo'');' 


END 

UPDATE:

CREATE PROCEDURE tbv21Setup 

AS 
BEGIN 

    EXEC sp_executesql N' 

    IF EXISTS(
     SELECT 1 
     FROM dbo.sysobjects 
     WHERE id = OBJECT_ID(''dbo.Cust_Address_View'') 
    ) DROP VIEW dbo.Cust_Address_View; 

    CREATE VIEW dbo.Cust_Address_View AS 
     SELECT customer.individual_id individual_id, 
      customer.tb_customer_id customer_id, 
      customer.customer_category_lkp customer_category_lkp, 
      ADDRESS.postal_code postal_code 
     FROM CUSTOMER 
     INNER JOIN INDIVIDUAL 
     ON (CUSTOMER.individual_id = INDIVIDUAL.individual_id) 
     JOIN 
      (SELECT address_id , 
      a.individual_id , 
      postal_code , 
      obsolete_flag , 
      tb_modified_date 
      FROM address a 
      INNER JOIN 
      (SELECT individual_id, 
       MAX(ISNULL((tb_modified_date),(''01/01/1900''))) AS max_tb_modified_date 
      FROM ADDRESS 
      WHERE obsolete_flag = 0 
      GROUP BY individual_id 
      ) AS xa 
      ON (xa.individual_id     = a.individual_id 
      AND xa.max_tb_modified_date   = ISNULL((a.tb_modified_date),(''01/01/1900''))) 
      WHERE a.obsolete_flag     = 0 
     ) AS ADDRESS ON (ADDRESS.individual_id = INDIVIDUAL.individual_id) 
     AND customer.customer_category_lkp  = 
      (SELECT lookup_id 
      FROM lookup 
      WHERE lookup_category_name = ''customer_category'' 
      AND code_string   =''prospect'' 
     ) 
     AND customer.obsolete_flag =0 
     AND ADDRESS.postal_code NOT IN (''UNKNOWN'',''unknown'',''U'',''u'','' '','''');' 

EXEC sp_executesql N' 

    ALTER TABLE dbo.tb_customer_attribute 
    ADD tb_customer_attribute_id UNIQUEIDENTIFIER DEFAULT NEWID() PRIMARY KEY, 
       obsolete_flag int, 
       revision_number INT; 

    IF EXISTS(
     SELECT 1 
     FROM dbo.sysobjects 
     WHERE id = OBJECT_ID(''dbo.tb_comm_hist_xfer'') 
    ) DROP TABLE dbo.tb_comm_hist_xfer; 

    CREATE TABLE dbo.tb_comm_hist_xfer (
     tb_comm_hist_xfer_id binary(16) NOT NULL, 
     tb_old_customer_id int NOT NULL, 
     tb_customer_id int NULL, 
     date_entered datetime NOT NULL 
    ); 

    IF EXISTS(
     SELECT 1 
     FROM dbo.sysobjects 
     WHERE id = OBJECT_ID(''dbo.TBLogger'') 
    ) DROP TABLE dbo.TBLogger; 

    CREATE TABLE dbo.TBLogger (logDate DATETIME, logSQL VARCHAR(MAX), logRows INT, errKode INT); 

    IF EXISTS(
     SELECT 1 
     FROM dbo.sysobjects 
     WHERE id = OBJECT_ID(''dbo.crb_parameter'') 
    ) DROP TABLE dbo.crb_parameter; 

    CREATE TABLE dbo.crb_parameter (stgdb_prefix VARCHAR(255)); 

    INSERT INTO dbo.crb_parameter VALUES (''tommydev1.dbo'');' 

END 
+0

是的,你的解決方案完美無缺。謝謝。 – vchitta 2013-04-24 06:59:04

+0

不客氣@vchitta。 – Devart 2013-04-24 07:00:09

+1

@Devart - 你需要添加如果存在拖放視圖,然後創建它。因爲當用戶多次調用這個存儲過程時,它會在查看存在時拋出錯誤。 – AnandPhadke 2013-04-24 07:02:35

1

你不能創建一個過程內部的視圖。

因此你可以首先單獨創建一個視圖象下面這樣:

CREATE VIEW Cust_Address_View AS 
     SELECT customer.individual_id individual_id, 
      customer.tb_customer_id customer_id, 
      customer.customer_category_lkp customer_category_lkp, 
      ADDRESS.postal_code postal_code 
     FROM CUSTOMER 
     INNER JOIN INDIVIDUAL 
     ON (CUSTOMER.individual_id = INDIVIDUAL.individual_id) 
     JOIN 
      (SELECT address_id , 
      a.individual_id , 
      postal_code , 
      obsolete_flag , 
      tb_modified_date 
      FROM address a 
      INNER JOIN 
      (SELECT individual_id, 
       MAX(ISNULL((tb_modified_date),('01/01/1900'))) AS max_tb_modified_date 
      FROM ADDRESS 
      WHERE obsolete_flag = 0 
      GROUP BY individual_id 
      ) AS xa 
      ON (xa.individual_id     = a.individual_id 
      AND xa.max_tb_modified_date   = ISNULL((a.tb_modified_date),('01/01/1900'))) 
      WHERE a.obsolete_flag     = 0 
     ) AS ADDRESS ON (ADDRESS.individual_id = INDIVIDUAL.individual_id) 
     AND customer.customer_category_lkp  = 
      (SELECT lookup_id 
      FROM lookup 
      WHERE lookup_category_name = 'customer_category' 
      AND code_string   ='prospect' 
     ) 
     AND customer.obsolete_flag =0 
     AND ADDRESS.postal_code NOT IN ('UNKNOWN','unknown','U','u',' ',''); 

然後用這個觀點在程序按您的要求

或使用動態SQL:

CREATE PROCEDURE tbv21Setup 

AS 
BEGIN 

    EXEC sp_executesql N' 

    CREATE VIEW Cust_Address_View AS 
     SELECT customer.individual_id individual_id, 
      customer.tb_customer_id customer_id, 
      customer.customer_category_lkp customer_category_lkp, 
      ADDRESS.postal_code postal_code 
     FROM CUSTOMER 
     INNER JOIN INDIVIDUAL 
     ON (CUSTOMER.individual_id = INDIVIDUAL.individual_id) 
     JOIN 
      (SELECT address_id , 
      a.individual_id , 
      postal_code , 
      obsolete_flag , 
      tb_modified_date 
      FROM address a 
      INNER JOIN 
      (SELECT individual_id, 
       MAX(ISNULL((tb_modified_date),(''01/01/1900''))) AS max_tb_modified_date 
      FROM ADDRESS 
      WHERE obsolete_flag = 0 
      GROUP BY individual_id 
      ) AS xa 
      ON (xa.individual_id     = a.individual_id 
      AND xa.max_tb_modified_date   = ISNULL((a.tb_modified_date),(''01/01/1900''))) 
      WHERE a.obsolete_flag     = 0 
     ) AS ADDRESS ON (ADDRESS.individual_id = INDIVIDUAL.individual_id) 
     AND customer.customer_category_lkp  = 
      (SELECT lookup_id 
      FROM lookup 
      WHERE lookup_category_name = ''customer_category'' 
      AND code_string   =''prospect'' 
     ) 
     AND customer.obsolete_flag =0 
     AND ADDRESS.postal_code NOT IN (''UNKNOWN'',''unknown'',''U'',''u'','' '','''');' 

IF EXISTS(select * from sys.objects where name='Cust_Address_View') 
drop view Cust_Address_View 
EXEC sp_executesql N' 

    ALTER TABLE tb_customer_attribute 
    ADD tb_customer_attribute_id UNIQUEIDENTIFIER DEFAULT NEWID() PRIMARY KEY, 
       obsolete_flag int, 
       revision_number int; 

    CREATE TABLE tb_comm_hist_xfer (
     tb_comm_hist_xfer_id binary(16) NOT NULL, 
     tb_old_customer_id int NOT NULL, 
     tb_customer_id int NULL, 
     date_entered datetime NOT NULL 
    ); 

    CREATE TABLE TBLogger (logDate DATETIME, logSQL VARCHAR(MAX), logRows INT, errKode INT); 

    CREATE TABLE crb_parameter (stgdb_prefix VARCHAR(255)); 

    INSERT INTO crb_parameter VALUES (''tommydev1.dbo'');' 


END 
+1

它可以創建使用'動態查詢'.http://stackoverflow.com/questions/7712702/creating-a-view-using-stored-procedure.But反正這是一個壞主意 – praveen 2013-04-24 06:43:01

+0

是的使用動態查詢,但不喜歡在這裏創建一個。 – AnandPhadke 2013-04-24 06:44:42

相關問題