【发布时间】:2017-04-20 14:47:23
【问题描述】:
我做了一个这样的存储过程..
CREATE PROCEDURE [dbo].[sp_dataPull] @serverName nvarchar(30), @dbName nvarchar (30), @serverName2 nvarchar(30), @dbName2 nvarchar (30)
INSERT INTO sampleDatabase.dbo.WorkFlowCopy
([ServerName]
,[DBName]
,[ID]
,[ActivityDefinitionID]
,[ParentID]
,[Caption]
,[Description]
,[ShortDescription]
(SELECT @serverName, @dbName, sdb1.* from OPENDATASOURCE('SQLOLEDB',
'Data Source=phmnldb16\eaudit;user id=XXXX;password=XXXX').AUDIT_FSA_170_001.AUD170.Workflow sdb1)
UNION ALL
(SELECT @serverName2, @dbName2, sdb2.* from OPENDATASOURCE('SQLOLEDB',
'Data Source=phmnldb16\eaudit;user id=XXXX;password=XXXX').AUDIT_FSA_170_002.AUD170.Workflow sdb2)
此查询的功能是将数据从另一台服务器移动到特定的表中。现在,请注意下面有 2 个 SELECT 语句,并且有 4 个参数。这是因为我合并了 2 个表并把它移到了另一个表中。
这个查询的问题在于它是静态的。如果我需要合并 3 个或更多表怎么办?然后我必须创建另一个(下面的 SELECT 和 UNION ALL 语句并添加另外 2 个或更多参数)。我想让它成为 DYNAMIC。
【问题讨论】:
-
您的语法看起来像 SQL Server。为什么问题标记为 Oracle?
-
你好,戈登,它是 SQL Server。但我标记了 5 个不同的名称作为堆栈溢出需要。
-
不需要标记5
-
使用光标循环浏览服务器和数据库名称列表。您可以传入表格参数或逗号分隔列表,并使用拆分字符串函数将其放入表格中。
-
旁注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本不使用前缀!
标签: sql sql-server database dynamic