2013-04-24 94 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

相关问题