2017-03-29 6 views
0

Ich versuche, eine ziemlich einfache indizierte Sicht zu scripten, aber SQL lehnt einfach meine Bemühungen ab. Ich habe versucht, das Problem zu untersuchen, habe aber kein Glück gehabt, und leider bin ich nicht gerade ein SQL-Experte, also bin ich mir nicht sicher, ob es etwas Einfaches gibt, das ich vermisse. Die Vorlage für dieses Skript wurde mir von einem DBA übergeben, aber er weiß nicht mehr als ich. Hier ist das obere Ende des Skripts, wo der erste Fehler angezeigt:Kann keine indizierte Sicht mit Schemabinding erstellen

--Set the options to support indexed views. 
SET NUMERIC_ROUNDABORT OFF; 
GO 
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, 
    QUOTED_IDENTIFIER, ANSI_NULLS ON; 
GO 
--Create view with schemabinding. 
IF OBJECT_ID ('[dbo].[APIMenus]', 'view') IS NOT NULL 
    DROP VIEW [dbo].[APIMenus] ; 
GO 
BEGIN 
    CREATE VIEW [dbo].[APIMenus] 
    WITH SCHEMABINDING 
    AS 
     SELECT 
      [t0].[GroupName] AS [defaultValue], 
      [t1].[GroupName] AS [transValue],..... 

Der Fehler ist "CREATE VIEW must be the only statement in the batch" aber von dem, was ich verstehe, ist es in den BEGIN...END mit dem richtigen GO Aussagen Verpackung vor und nach sollte das Problem gelöst hat, aber es besteht fort. Kann jemand sehen, was ich falsch mache?

Antwort

1

Der Fehler ist korrekt. Das Umhüllen eines CREATE VIEW in BEGIN/END funktioniert nicht um diese Nachricht zu vermeiden. Wenn Sie die BEGIN/END vollständig entfernen, damit die Stapelverarbeitung mit CREATE VIEW beginnt und mit einer weiteren GO endet, nachdem die Ansicht definiert wurde, ist der Fehler verschwunden, und Sie können diese DROP-Struktur vor der Struktur weiter verwenden.

Eine etwas andere Art und Weise, dieses Problem zu behandeln nicht das Erstellen einer Ansicht, die bereits vorhanden ist, ist dynamisch SQL aufzurufen:

if OBJECT_ID ('[dbo].[cars]', 'view') IS NOT NULL 
    exec ('create view cars as select * from vans where type=1') 
go 

Manchmal habe ich gesehen:

if OBJECT_ID ('[dbo].[cars]', 'view') IS NOT NULL 
    exec ('create view cars as select 1') 
go 
alter view cars as 
    select * from vans where type==1 
GO 

Diese letztere Technik hat den Vorteil, dass Ihr komplexes SQL nicht in eine Zeichenfolge eingebettet ist und Sie es gut formatieren können.

Verwandte Themen