Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 刷新用户函数t-SQL上的元数据_Sql Server_Tsql_Sql Server 2008 - Fatal编程技术网

Sql server 刷新用户函数t-SQL上的元数据

Sql server 刷新用户函数t-SQL上的元数据,sql-server,tsql,sql-server-2008,Sql Server,Tsql,Sql Server 2008,我正在做一些T-SQL编程,我的数据库上有一些视图定义。这些天数据模型仍在变化,我定义了一些表函数。有时我故意使用 select * from MYVIEW 在这样的表函数中返回所有列。如果视图(或表)更改,函数将崩溃,我需要重新编译它。我知道总的来说这是件好事,这样可以避免很多错误,但仍然 有没有一种方法可以编写这样的函数,这样每次我在基础表上更改某些内容时,函数就不会在我面前爆炸?或者也许我做错了什么 感谢您的帮助将视图定义为“使用SCHEMABINDING” 我会让你们参考我的答案,其

我正在做一些T-SQL编程,我的数据库上有一些视图定义。这些天数据模型仍在变化,我定义了一些表函数。有时我故意使用

 select * from MYVIEW
在这样的表函数中返回所有列。如果视图(或表)更改,函数将崩溃,我需要重新编译它。我知道总的来说这是件好事,这样可以避免很多错误,但仍然

有没有一种方法可以编写这样的函数,这样每次我在基础表上更改某些内容时,函数就不会在我面前爆炸?或者也许我做错了什么

感谢您的帮助

将视图定义为“使用SCHEMABINDING”

我会让你们参考我的答案,其中包含了类似的内容

在这种情况下,问题不在于udf,而在于视图在没有模式绑定的情况下的行为

编辑:Cade Roux的sp_refreshsqlmodule可能会起作用。我从未使用过它。

将视图定义为“带模式绑定”

我会让你们参考我的答案,其中包含了类似的内容

在这种情况下,问题不在于udf,而在于视图在没有模式绑定的情况下的行为

编辑:Cade Roux的sp_refreshsqlmodule可能会起作用。我从未使用过它。

是最好的-但是当您使用SCHEMABINDING时,这通常会阻止您在不先删除SCHEMABINDING,然后在重新创建模块时替换它的情况下进行底层更改。如果对象引用数据库外的对象,则不能使用SCHEMABINDING

如果这个困难太大,您不希望或不能使用SCHEMABINDING,那么在实际使用SQL模块之前(可以在任何非Schemabile视图、UDF、存储过程等上运行)使用某种常规流程检查SQL模块是否存在错误,这是您的朋友

您可以同时使用这两种技术—您不能(也不需要)对Schemabile对象运行sp_refreshsqlmodule

e、 例如,您只能在以下模块上运行它:

SELECT *
FROM    INFORMATION_SCHEMA.ROUTINES
        WHERE   (
                 OBJECTPROPERTY(OBJECT_ID(QUOTENAME(ROUTINE_SCHEMA) + '.' + QUOTENAME(ROUTINE_NAME)), N'IsSchemaBound') IS NULL
                 OR OBJECTPROPERTY(OBJECT_ID(QUOTENAME(ROUTINE_SCHEMA) + '.' + QUOTENAME(ROUTINE_NAME)),
                                   N'IsSchemaBound') = 0
                )
是最好的—但是当您有SCHEMABINDING时,这通常会阻止您在不首先删除SCHEMABINDING然后在重新创建模块时替换它的情况下进行底层更改。如果对象引用数据库外的对象,则不能使用SCHEMABINDING

如果这个困难太大,您不希望或不能使用SCHEMABINDING,那么在实际使用SQL模块之前(可以在任何非Schemabile视图、UDF、存储过程等上运行)使用某种常规流程检查SQL模块是否存在错误,这是您的朋友

您可以同时使用这两种技术—您不能(也不需要)对Schemabile对象运行sp_refreshsqlmodule

e、 例如,您只能在以下模块上运行它:

SELECT *
FROM    INFORMATION_SCHEMA.ROUTINES
        WHERE   (
                 OBJECTPROPERTY(OBJECT_ID(QUOTENAME(ROUTINE_SCHEMA) + '.' + QUOTENAME(ROUTINE_NAME)), N'IsSchemaBound') IS NULL
                 OR OBJECTPROPERTY(OBJECT_ID(QUOTENAME(ROUTINE_SCHEMA) + '.' + QUOTENAME(ROUTINE_NAME)),
                                   N'IsSchemaBound') = 0
                )

我不相信这能达到他的目的。他想用select*修改视图中使用的表。请阅读MSDN SCHEMABINDING[…]中的以下内容。此外,如果参与具有模式绑定的视图的表上的ALTER TABLE语句影响视图定义,则这些语句将失败。我认为这正是luckyluke不希望看到的行为。@doug_w:hobson的选择:与SCHEMABINDING一起使用或每次运行sp_refreshview。别无选择。你可能还想阅读我的另一个答案,我引用了相同的链接。仅供参考,我在所有观点和UDF中都使用了SCHEMABINDING。我不相信这能实现他的目标。他想用select*修改视图中使用的表。请阅读MSDN SCHEMABINDING[…]中的以下内容。此外,如果参与具有模式绑定的视图的表上的ALTER TABLE语句影响视图定义,则这些语句将失败。我认为这正是luckyluke不希望看到的行为。@doug_w:hobson的选择:与SCHEMABINDING一起使用或每次运行sp_refreshview。别无选择。你可能还想阅读我的另一个答案,我引用了相同的链接。仅供参考,我在所有视图和UDF中都使用了SCHEMABINDING。我不知道这是存在的,因为我只使用SCHEMABINDING。有用。@gbn-我尽可能使用SCHEMABINDING,但它不能跨数据库工作(这是正确的),它只能在其他Schemabile对象上工作-如果链中的任何对象不能是Schemabile,那么SCHEMABINDING的使用到此为止。在这种情况下,可以使用sp_refreshsqlmodule对中断的外部更改进行充分监控,然后它们才真正中断任何更改。sp_refreshsqlmodule将导致SQL Server 2005中表值UDF上的扩展属性丢失(但当您更改它们以删除并重新添加SCHEMABINDING时,这种情况已经发生)。我不知道存在这种情况,因为我只使用SCHEMABINDING。有用。@gbn-我尽可能使用SCHEMABINDING,但它不能跨数据库工作(这是正确的),它只能在其他Schemabile对象上工作-如果链中的任何对象不能是Schemabile,那么SCHEMABINDING的使用到此为止。在这种情况下,可以使用sp_refreshsqlmodule对中断的外部更改进行充分监控,然后它们才真正中断任何更改。sp_refreshsqlmodule将导致SQL Server 2005中表值UDF上的扩展属性丢失(但当您更改它们以删除并重新添加SCHEMABINDING时,这种情况已经发生)。