我已经写过这段代码而有人帮助了我,但我无法弄清楚'''''''''''''''对数据库引擎意味着。这真的有助于我理解我在这里所写的内容。
USE master
EXEC sp_MSforeachdb 'use ? select ''?'', st.NAME, sc.NAME,
sc.system_type_id, db_name()
FROM sys.tables st
INNER JOIN sys.columns sc ON st.object_id = sc.object_id
WHERE (st.name LIKE ''rawp%'' or st.name like ''main'')'
我理解我在实例中搜索所有数据库中的列名及其相关表格,但我需要了解'''''''''''''''适合查询。谢谢!
答案 0 :(得分:2)
来自http://weblogs.sqlteam.com/joew/archive/2008/08/27/60700.aspx
请注意,[?]用作此前未指定数据库名称的占位符
因此?
将替换为数据库名称。
请注意,将其写为
可能更好EXEC sp_MSforeachdb 'use [?] select ''?'', st.NAME, sc.NAME,
支持数据库"搞笑"名称,如[Hello[] World'
答案 1 :(得分:1)
使用?
时,sp_MSforeachdb
是所有数据库名称的占位符。因此,当它遍历所有数据库时,它会将?
替换为您使用的调用存储过程的指定即席查询中的实际数据库名称。
注意:建议不要使用此存储过程。 Please see the following blog post on reasons why not to use sp_MSforeachdb 强>
答案 2 :(得分:0)
这通常意味着准备好的语句,参数将在以后填写。 (见http://en.wikipedia.org/wiki/Prepared_statements#Parameterized_statements)。但是这里是数据库名称的占位符
答案 3 :(得分:0)
您可能想查看这个问题,该问题有答案。
答案 4 :(得分:0)
?
它通常是参数的占位符,稍后会填充。有关详细信息,请参阅https://en.wikipedia.org/wiki/Prepared_statement#Parameterized_statements。
答案 5 :(得分:0)
sp_msforeachdb
有点......特别。我的意思是部分地乘坐短途巴士"这个词的意义(甚至在这里并不完全公平;我的主要抱怨是它没有记载),但大多数情况下我只是意味着它是独一无二的。此语法仅用于sp_msforeachdb
和sp_msforeachtable
,并且在Sql Server本身中没有其他地方使用。
但是,您应该想到的是,您是否编写过使用OLE或ODBC提供程序进行参数化查询的代码。这些工具使用?
字符作为参数占位符。类似的东西在这里发生。 ?
字符是参数占位符,其中参数的值稍后将设置为服务器中每个数据库的名称,包括master
,tempdb
,model
,和msdb
。
尝试运行此代码以了解其工作原理:
EXEC sp_MSforeachdb 'print ''?'' '
将这个过程用于维护,报告和警报脚本这样的事情很诱人,但是你可能只想谨慎地做一些事情。最好不要依赖无证行为。在另一个答案中首先发布的sqlblog link是关于该主题的标准思考。
基本上,可能没有特定的计划退休或破坏此程序(或其他sp_*
程序),但也有很多零投资将这些程序从版本转移到版本。例如,链接的文章表明sp_msforeachdb依赖于旧dbo.sysdatabases
而不是更正确的sys.databases
。我不希望微软直接定位sp_msforeachdb,但是如果他们决定删除dbo.sysdatabases
,我的期望是他们的测试会发现sp_msforeachdb被破坏了,那时他们也只是删除了sp_msforeachdb而不是修复它。