2015-03-03 75 views
0

有没有一种方法可以保存sql连接的详细信息并在同一个脚本中重新使用它们。我写了下面的内容,将3个sql表的内容导出到同一个数据库中。它的工作原理,但它重新使用一个代码的负载,我不知道如何减少它。在PowerShell中存储并重新使用sql连接字符串

我试过声明所有的连接信息,然后说明它现在的完整代码的位置,但只输出第一个表3次。

我也试过说过一次在开始时再次没有工作。

#agent_lookup 

$server = "test" 
$database = "MI_Lookups" 
$query = "EXEC [dbo].[proc_update_new_agents] 
      SELECT [l].agent_key AS 'Agent_Key' 
        ,ISNULL([l].agent_name,'') AS 'Agent_Name' 
        ,ISNULL([l].agent_name_1,'') AS 'Agent_Name_1' 
        ,ISNULL([l].agent_type,'') AS 'Agent_Type' 
      FROM [dbo].[agent_test] AS [l] 
      ORDER by [l].agent_key asc" 

$connection = New-Object System.Data.SqlClient.SqlConnection("Data Source=$server;Integrated Security=SSPI;Initial Catalog=$database;") 
$command = New-Object System.Data.SqlClient.SqlCommand($query, $connection) 
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter($command) 
$DataSet = New-Object System.Data.DataSet 

$SqlAdapter.Fill($DataSet) 
$DataSet.Tables[0] | Export-Csv $saveloaction\"Agent_Lookup.csv" 
$connection.Close() 

#organisation_lookup 

$server = "test" 
$database = "MI_Lookups" 
$query = "EXEC [dbo].[proc_update_new_organisations] 
      SELECT [l].organisation_key AS 'Organisation_Key' 
        ,ISNULL([l].broker_name,'') AS 'Broker_Name' 
        ,ISNULL([l].team_member,'') AS 'Team_Member' 
        ,ISNULL([l].team_leader,'') AS 'Team_Leader' 
      FROM [dbo].[orgnisation_test] as [l] 
      ORDER BY [l].organisation_key asc" 

$connection = New-Object System.Data.SqlClient.SqlConnection("Data Source=$server;Integrated Security=SSPI;Initial Catalog=$database;") 
$command = New-Object System.Data.SqlClient.SqlCommand($query, $connection) 
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter($command) 
$DataSet = New-Object System.Data.DataSet 

$SqlAdapter.Fill($DataSet) 
$DataSet.Tables[0] | Export-Csv $saveloaction\"Organisation_Lookup.csv" 
$connection.Close() 

#insurer_lookup 

$server = "test" 
$database = "MI_Lookups" 
$query = "EXEC [dbo].[proc_update_new_insurers] 
      SELECT [l].insurer_key AS 'Insurer_Key' 
        ,ISNULL([l].insurer_name,'') AS 'Insurer_Name' 
        ,ISNULL([l].insurer_name_1,'') AS 'Insurer_Name_1' 
        ,ISNULL([l].team_member,'') AS 'Team_Member' 
        ,ISNULL([l].team_leader,'') AS 'Team_Leader' 
      FROM [dbo].[insurer_test] AS [l] 
      ORDER BY [l].insurer_key asc" 

$connection = New-Object System.Data.SqlClient.SqlConnection("Data Source=$server;Integrated Security=SSPI;Initial Catalog=$database;") 
$command = New-Object System.Data.SqlClient.SqlCommand($query, $connection) 
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter($command) 
$DataSet = New-Object System.Data.DataSet 

$SqlAdapter.Fill($DataSet) 
$DataSet.Tables[0] | Export-Csv $saveloaction\"Insurer_Lookup.csv" 
$connection.Close() 

这似乎是合乎逻辑的我只需要编写一次的连接信息,但我是新来的PowerShell和努力,使这个简单,我敢肯定,也是应该的。以上是基本相同的脚本重复三次与不同的表引用。

一如既往的感谢。

回答

1

我会用一个函数来处理查询的执行。这样你只需要改变查询和存储输出的地方。

请注意,我已将数据库详细信息作为全局变量。如果您只使用这一个脚本,这很好,但如果此脚本正在调用或被其他脚本调用,则最好避免。

function Query-ToCsv($query, $csvLocation) { 

    try { 
     $command = New-Object System.Data.SqlClient.SqlCommand($query, $connection) 
     $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter($command) 
     $DataSet = New-Object System.Data.DataSet 
     $SqlAdapter.Fill($DataSet) 
     $DataSet.Tables[0] | Export-Csv $csvLocation 
    } 
    catch { 
     Write-Warning "Exception: " + $_.Exception.Message 
    } 
} 

# script globals 
$server = "test" 
$database = "MI_Lookups" 
$connection = New-Object System.Data.SqlClient.SqlConnection("Data Source=$server;Integrated Security=SSPI;Initial Catalog=$database;") 

#agent_lookup 
$query = "EXEC [dbo].[proc_update_new_agents] 
      SELECT [l].agent_key AS 'Agent_Key' 
        ,ISNULL([l].agent_name,'') AS 'Agent_Name' 
        ,ISNULL([l].agent_name_1,'') AS 'Agent_Name_1' 
        ,ISNULL([l].agent_type,'') AS 'Agent_Type' 
      FROM [dbo].[agent_test] AS [l] 
      ORDER by [l].agent_key asc" 

Query-ToCsv $query "$saveloaction\Agent_Lookup.csv" 

#organisation_lookup 
$query = "EXEC [dbo].[proc_update_new_organisations] 
      SELECT [l].organisation_key AS 'Organisation_Key' 
        ,ISNULL([l].broker_name,'') AS 'Broker_Name' 
        ,ISNULL([l].team_member,'') AS 'Team_Member' 
        ,ISNULL([l].team_leader,'') AS 'Team_Leader' 
      FROM [dbo].[orgnisation_test] as [l] 
      ORDER BY [l].organisation_key asc" 


Query-ToCsv $query "$saveloaction\Organisation_Lookup.csv" 

#insurer_lookup 
$query = "EXEC [dbo].[proc_update_new_insurers] 
      SELECT [l].insurer_key AS 'Insurer_Key' 
        ,ISNULL([l].insurer_name,'') AS 'Insurer_Name' 
        ,ISNULL([l].insurer_name_1,'') AS 'Insurer_Name_1' 
        ,ISNULL([l].team_member,'') AS 'Team_Member' 
        ,ISNULL([l].team_leader,'') AS 'Team_Leader' 
      FROM [dbo].[insurer_test] AS [l] 
      ORDER BY [l].insurer_key asc" 

Query-ToCsv $query "$saveloaction\Insurer_Lookup.csv" 

$connection.Close() 

请注意,这是未经测试(显然,因为我没有访问到你的数据库),但应该让你在正确的方向前进。

+0

天才!我能够完美地实现这一点。我甚至设法在脚本的另一个元素中重新使用try/catch,并将结果附加到日志文件中。谢谢。 – chris1982 2015-03-04 09:11:22

0

您可以简单地重新使用连接对象。我已经编辑了你的代码来做到这一点,但我没有运行它 - 对不起,如果我做了一些不好的编辑,但它的主旨应该是正确的。

$server = "test" 
$database = "MI_Lookups" 
$connection = New-Object System.Data.SqlClient.SqlConnection("Data Source=$server;Integrated Security=SSPI;Initial Catalog=$database;") 

#agent_lookup 

$query = "EXEC [dbo].[proc_update_new_agents] 
      SELECT [l].agent_key AS 'Agent_Key' 
        ,ISNULL([l].agent_name,'') AS 'Agent_Name' 
        ,ISNULL([l].agent_name_1,'') AS 'Agent_Name_1' 
        ,ISNULL([l].agent_type,'') AS 'Agent_Type' 
      FROM [dbo].[agent_test] AS [l] 
      ORDER by [l].agent_key asc" 

$command = New-Object System.Data.SqlClient.SqlCommand($query, $connection) 
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter($command) 
$DataSet = New-Object System.Data.DataSet 

$SqlAdapter.Fill($DataSet) 
$DataSet.Tables[0] | Export-Csv $saveloaction\"Agent_Lookup.csv" 

#organisation_lookup 

$query = "EXEC [dbo].[proc_update_new_organisations] 
      SELECT [l].organisation_key AS 'Organisation_Key' 
        ,ISNULL([l].broker_name,'') AS 'Broker_Name' 
        ,ISNULL([l].team_member,'') AS 'Team_Member' 
        ,ISNULL([l].team_leader,'') AS 'Team_Leader' 
      FROM [dbo].[orgnisation_test] as [l] 
      ORDER BY [l].organisation_key asc" 

$command = New-Object System.Data.SqlClient.SqlCommand($query, $connection) 
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter($command) 
$DataSet = New-Object System.Data.DataSet 

$SqlAdapter.Fill($DataSet) 
$DataSet.Tables[0] | Export-Csv $saveloaction\"Organisation_Lookup.csv" 

#insurer_lookup 

$query = "EXEC [dbo].[proc_update_new_insurers] 
      SELECT [l].insurer_key AS 'Insurer_Key' 
        ,ISNULL([l].insurer_name,'') AS 'Insurer_Name' 
        ,ISNULL([l].insurer_name_1,'') AS 'Insurer_Name_1' 
        ,ISNULL([l].team_member,'') AS 'Team_Member' 
        ,ISNULL([l].team_leader,'') AS 'Team_Leader' 
      FROM [dbo].[insurer_test] AS [l] 
      ORDER BY [l].insurer_key asc" 

$command = New-Object System.Data.SqlClient.SqlCommand($query, $connection) 
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter($command) 
$DataSet = New-Object System.Data.DataSet 

$SqlAdapter.Fill($DataSet) 
$DataSet.Tables[0] | Export-Csv $saveloaction\"Insurer_Lookup.csv" 

$connection.Close()