如何在不重新创建视图的情况下关闭视图的 SCHEMABINDING?

gar*_*rik 24 sql-server-2008 sql-server view

如何在SCHEMABINDING不重新创建视图的情况下关闭视图?

gbn*_*gbn 13

是的。使用 SCHEMABINDING 很好(我们总是这样做),有时您必须删除它才能更改依赖对象。只是改变视图

ALTER VIEW myView
--Remove this WITH SCHEMABINDING
AS
SELECT ...
GO
Run Code Online (Sandbox Code Playgroud)


SQL*_*tar 10

ALTER VIEW 不允许您完成此操作吗?创建视图时,您将执行以下操作:

CREATE VIEW
WITH SCHEMABINDING
AS
SELECT stmt
GO
Run Code Online (Sandbox Code Playgroud)

因此,丢失 WITH 子句:

ALTER VIEW viewname
AS
SELECT stmt
GO
Run Code Online (Sandbox Code Playgroud)

请参阅MSDN 上的 ALTER VIEW


bob*_*mar 7

环顾了几个小时后,我为此创建了 2 个存储过程。希望这有助于某人

CREATE PROCEDURE ViewRemoveSchemaBinding
    @ViewName VARCHAR(MAX)
AS
BEGIN
    DECLARE @PositionShemaBinding INT
    DECLARE @Command NVARCHAR(MAX)

    SELECT @Command = OBJECT_DEFINITION(OBJECT_ID(@ViewName));
    SET @PositionShemaBinding = CHARINDEX('WITH SCHEMABINDING', @Command)

    IF NOT @PositionShemaBinding = 0 BEGIN
        -- WITH SCHEMA BINDING IS PRESENT... Let's remove it !
        SET @Command = STUFF(@Command, CHARINDEX('WITH SCHEMABINDING', @Command), LEN('WITH SCHEMABINDING'), '');
        SET @Command = REPLACE(@Command, 'CREATE VIEW', 'ALTER VIEW');

        EXECUTE sp_executesql @Command
    END
END
Run Code Online (Sandbox Code Playgroud)

并放置 SCHEMABINDING :

CREATE PROCEDURE ViewAddSchemaBinding
    @ViewName VARCHAR(MAX)
AS
BEGIN
    DECLARE @PositionShemaBinding INT
    DECLARE @Command NVARCHAR(MAX)
    DECLARE @ObjectName VARCHAR(MAX)

    SELECT  @Command = OBJECT_DEFINITION(OBJECT_ID(@ViewName)),
            @ObjectName = OBJECT_NAME(OBJECT_ID(@ViewName));

    SET @PositionShemaBinding = PATINDEX('%WITH SCHEMABINDING%', @Command)

    IF @PositionShemaBinding = 0 BEGIN
        -- WITH SCHEMA BINDING IS NOT PRESENT... Let's add it !
        SET @Command = REPLACE(@Command, 'CREATE VIEW', 'ALTER VIEW');

        -- IF OBJECT NAME IS INTO BRAKETS, We need to handle it
       IF NOT CHARINDEX('[' + @ObjectName + ']', @Command) = 0 BEGIN
           SET @ObjectName = '[' + @ObjectName + ']'
       END

       SET @Command = STUFF(@Command, CHARINDEX(@ObjectName, @Command), LEN(@ObjectName), @ObjectName + ' WITH SCHEMABINDING ');

        EXECUTE sp_executesql @Command
    END
END
Run Code Online (Sandbox Code Playgroud)

它“按原样”提供...