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