2011-12-07 20 views

उत्तर

19

यहां एक उदाहरण है जिसे मैंने this blog पर पाया।

$cn2 = new-object system.data.SqlClient.SQLConnection("Data Source=machine1;Integrated Security=SSPI;Initial Catalog=master"); 
$cmd = new-object system.data.sqlclient.sqlcommand("dbcc freeproccache", $cn2); 
$cn2.Open(); 
if ($cmd.ExecuteNonQuery() -ne -1) 
{ 
    echo "Failed"; 
} 
$cn2.Close(); 

मुमकिन है आप एक अलग TSQL बयान स्थानापन्न सकता है जहां यह dbcc freeproccache कहते हैं।

73

आप Invoke-Sqlcmd cmdlet

Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance "MyComputer\MyInstance" 

http://technet.microsoft.com/en-us/library/cc281720.aspx

+16

किसी ने (यदि आप अपने कार्य केंद्र का उपयोग कर रहे इतना उल्लेख करना चाहिए इस महान यदि आप SQL सर्वर के संदर्भ में कर रहे हैं हो सकता है, लेकिन नहीं ... – aikeru

+8

आप इस कहीं भी एसक्यूएल सर्वर क्लाइंट उपकरण चला सकते हैं SSMS) स्थापित हैं। यह किसी भी वर्कस्टेशन से ठीक काम करता है, चाहे वह SQL सर्वर चला रहा हो या नहीं। – alroc

+3

cmdlet उपलब्ध कराने के लिए निम्न आयात का उपयोग करें: 'आयात-मॉड्यूल "sqlps" -DisableNameChecking' –

6

उपयोग कर सकते हैं आप अपने स्थानीय मशीन पर के बजाय एसक्यूएल सर्वर के संदर्भ में यह करने के लिए तो मैं निम्नलिखित का प्रयोग करेंगे चाहते हैं । यह वही है जो हम अपनी कंपनी में उपयोग करते हैं।

$ServerName = "_ServerName_" 
$DatabaseName = "_DatabaseName_" 
$Query = "SELECT * FROM Table WHERE Column = ''" 

#Timeout parameters 
$QueryTimeout = 120 
$ConnectionTimeout = 30 

#Action of connecting to the Database and executing the query and returning results if there were any. 
$conn=New-Object System.Data.SqlClient.SQLConnection 
$ConnectionString = "Server={0};Database={1};Integrated Security=True;Connect Timeout={2}" -f $ServerName,$DatabaseName,$ConnectionTimeout 
$conn.ConnectionString=$ConnectionString 
$conn.Open() 
$cmd=New-Object system.Data.SqlClient.SqlCommand($Query,$conn) 
$cmd.CommandTimeout=$QueryTimeout 
$ds=New-Object system.Data.DataSet 
$da=New-Object system.Data.SqlClient.SqlDataAdapter($cmd) 
[void]$da.fill($ds) 
$conn.Close() 
$ds.Tables 

बस $ सर्वर नाम, $ DatabaseName भर $ क्वेरी चर और तुम जाना अच्छा होना चाहिए।

मुझे यकीन नहीं है कि हमने इसे मूल रूप से कैसे पाया, लेकिन कुछ ऐसा ही है here

15

इस समारोह powershell में ऑब्जेक्ट की श्रृंखला के रूप में एक प्रश्न के परिणाम वापस आ जाएगी, ताकि आप उन्हें फिल्टर और आसानी से उपयोग कर सकते स्तंभों में उपयोग कर सकते हैं:

function sql($sqlText, $database = "master", $server = ".") 
{ 
    $connection = new-object System.Data.SqlClient.SQLConnection("Data Source=$server;Integrated Security=SSPI;Initial Catalog=$database"); 
    $cmd = new-object System.Data.SqlClient.SqlCommand($sqlText, $connection); 

    $connection.Open(); 
    $reader = $cmd.ExecuteReader() 

    $results = @() 
    while ($reader.Read()) 
    { 
     $row = @{} 
     for ($i = 0; $i -lt $reader.FieldCount; $i++) 
     { 
      $row[$reader.GetName($i)] = $reader.GetValue($i) 
     } 
     $results += new-object psobject -property $row    
    } 
    $connection.Close(); 

    $results 
} 
+0

'डेटाटेबल' भरने पर यह बेहतर क्यों है (देखें [एडम का उत्तर] (http://stackoverflow.com/a/17497834/1324345))? – alroc

+2

शायद कोई बड़ा अंतर नहीं है, लेकिन SqlDataReaders को आम तौर पर प्राथमिकता दी जाती है क्योंकि वे कम संसाधनों का उपभोग करते हैं। यह यहां प्रासंगिक होने की संभावना नहीं है लेकिन वास्तविक डेटा को वापस प्राप्त करने के लिए अच्छा है, जिसे आप फोरैच में उपयोग कर सकते हैं और जहां डेटा के स्रोत के बारे में चिंता किए बिना खंड। – mcobrien

5

वहाँ एक अंतर्निहित नहीं है "PowerShell" जिस तरह से एक एसक्यूएल क्वेरी चलाने के लिए। यदि आपके पास SQL Server tools installed है, तो आपको Invoke-SqlCmd cmdlet मिल जाएगा।

क्योंकि PowerShell .NET पर बनाया गया है, तो आप अपने प्रश्नों को चलाने के लिए ADO.NET API का उपयोग कर सकते हैं।

function Invoke-SQL { 
    param(
     [string] $dataSource = ".\SQLEXPRESS", 
     [string] $database = "MasterData", 
     [string] $sqlCommand = $(throw "Please specify a query.") 
    ) 

    $connectionString = "Data Source=$dataSource; " + 
      "Integrated Security=SSPI; " + 
      "Initial Catalog=$database" 

    $connection = new-object system.data.SqlClient.SQLConnection($connectionString) 
    $command = new-object system.data.sqlclient.sqlcommand($sqlCommand,$connection) 
    $connection.Open() 

    $adapter = New-Object System.Data.sqlclient.sqlDataAdapter $command 
    $dataset = New-Object System.Data.DataSet 
    $adapter.Fill($dataSet) | Out-Null 

    $connection.Close() 
    $dataSet.Tables 

} 

मैं इस का उपयोग किया गया इतने लंबे समय मैं डॉन ':

97

दूसरों जो सिर्फ शेयर .net और PowerShell (बिना किसी अतिरिक्त एसक्यूएल उपकरण स्थापित) यहाँ के साथ ऐसा करने की जरूरत के लिए समारोह है कि मैं का उपयोग करें टी नहीं जानता कि कौन से हिस्सों को लिखा गया था लेकिन यह अन्य उदाहरणों से आसवित था लेकिन स्पष्ट होने के लिए सरलीकृत और केवल अतिरिक्त निर्भरताओं या सुविधाओं के बिना क्या आवश्यक है।

मैं का उपयोग करें और यह अक्सर पर्याप्त है कि मैं GitHub पर एक स्क्रिप्ट मॉड्यूल में इस कर दिया है, ताकि आप अब अपने मॉड्यूल निर्देशिका पर जाकर git clone https://github.com/ChrisMagnuson/InvokeSQL निष्पादित और उस समय के बाद आह्वान-एसक्यूएल आप लोड हो जाएगा से कर सकते हैं जब तुम जाओ का हिस्सा इसका उपयोग करने के लिए (अपना उपयोग शक्तियों v3 या बाद में मानते हुए)।

+0

कोई फर्क नहीं पड़ता कि यहां या शक्ति में कोई फर्क नहीं पड़ता? – Maslow

+0

@ मास्लो मैं निश्चित रूप से नहीं कह सकता था, मुझे पता है कि यह ऑब्जेक्ट्स के निपटारे के बिना ठीक काम करता है लेकिन यदि आपके पास एक ही powerhell.exe प्रक्रिया है जो इसे बंद किए बिना सप्ताहों में कई बार कॉल करेगी तो यह अंततः एक मुद्दा हो सकती है लेकिन आपको इसका परीक्षण करना होगा। –

+1

ध्यान दें कि यह आपको स्क्रिप्ट लिखने के लिए मजबूर करता है जो एसक्यूएल इंजेक्शन हमलों के लिए कमजोर हो सकता है, अगर वे उपयोगकर्ता इनपुट पर निर्भर स्रोत से क्वेरी के लिए डेटा पढ़ने पर निर्भर करते हैं। –

2
Invoke-Sqlcmd -Query "sp_who" -ServerInstance . -QueryTimeout 3 
+1

क्या आप यह कोड समझा सकते हैं? – RamenChef

+0

यह powerhell कमांड द्वारा उपयोग किए गए एसक्यूएल में कनेक्शन की संख्या दिखाएगा –

संबंधित मुद्दे