2013-05-20 12 views
5

मुझे एक पावरहेल स्क्रिप्ट निष्पादित करने की आवश्यकता है जो डेटाबेस बनाने के लिए SQL स्क्रिप्ट निष्पादित करता है। मैं इस तरह से PowerShell आदेश exec मेरी जानकारी के आधार पर:Invoke-Sqlcmd, इनपुटफाइल, और वेरिएबल

Init.ps1

$DATABASEFILENAME = "C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008INSTANCE\MSSQL\DATA\myDB.mdf" 
$DATABASELOGNAME = "C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008INSTANCE\MSSQL\DATA\myDB_log.ldf" 
$DBUSEROWNER = "domain\spsetup" 

CreateDatabase.ps1

try { 
     $createDatabaseScript = ($scriptsFolder,$eachRelease,$DeployEnvironment,"Config" -join "\") + "\JM SiteRequest Database.sql" 
     $sqlVariable = "DATABASEFILENAME = '$DATABASEFILENAME'", "DATABASELOGNAME = '$DATABASELOGNAME'", "DBUSEROWNER = '$DBUSEROWNER'" 

     Invoke-Sqlcmd -ServerInstance "$MySQLServer" -InputFile "$createDatabaseScript" -ErrorAction Stop -Variable $sqlVariable 
} 
catch [Exception] { 
     Write-Error "Database error: $_.Exception" 
} 

SQL स्क्रिप्ट

CREATE DATABASE [SiteRequestDB] ON PRIMARY 
(NAME = N'SiteRequestDB', FILENAME = N'$(DATABASEFILENAME)' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB) LOG ON 
(NAME = N'SiteRequestDB_log', FILENAME = N'$(DATABASELOGNAME)' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%) 
GO 

मैंने @ चाड मिलर के सुझाव के रूप में $ sqlVariable को अपडेट किया। तो समस्या वहां थी। अब मुझे यह त्रुटि मिली है: डेटाबेस त्रुटि बनाना: डेटाबेस त्रुटि: कोई ऑब्जेक्ट या कॉलम नाम गुम या खाली है। विवरणों में चयन के लिए, प्रत्येक कॉलम का नाम सत्यापित करें। अन्य बयानों के लिए, खाली उपनाम नामों की तलाश करें। "" या [] के रूप में परिभाषित एलियंस की अनुमति नहीं है। उपनाम को वैध नाम में बदलें। लेबल 'सी' पहले ही घोषित कर दिया गया है। लेबल नाम एक क्वेरी बैच या संग्रहीत प्रक्रिया के भीतर अद्वितीय होना चाहिए .. अपवाद। अपवाद

+2

परिभाषित करें "काम नहीं करता है"। परिणाम की अपेक्षा से आप कितने परिणाम प्राप्त करते हैं? –

+0

क्या आप कुछ हार्ड कोड किए गए मान जोड़ सकते हैं। एक डेटा परीक्षण के रूप में "DATABASEFILENAME = MyFileName", "DATABASELOGNAME = 'sa'", "DBUSEROWNER = 'myUser'"? – granadaCoder

+0

मैंने प्रश्न –

उत्तर

6

Invoke-Sqlcmd cmdlet के लिए Variable पैरामीटर picky है। परिवर्तनीय असाइनमेंट से पहले या बाद में रिक्त स्थान शामिल न करें।

$sqlVariable = "DATABASEFILENAME='$DATABASEFILENAME'", "DATABASELOGNAME='$DATABASELOGNAME'", "DBUSEROWNER='$DBUSEROWNER'" 

इसके अलावा, आप चर से एकल उद्धरण हटाने की जरूरत है:

$sqlVariable = "DATABASEFILENAME=$DATABASEFILENAME", "DATABASELOGNAME=$DATABASELOGNAME", "DBUSEROWNER=$DBUSEROWNER" 
+0

आप सही हैं लेकिन अब मुझे निम्न त्रुटि मिली है डेटाबेस त्रुटि बनाना: डेटाबेस त्रुटि: कोई ऑब्जेक्ट या कॉलम नाम गुम या खाली है। विवरणों में चयन के लिए, प्रत्येक कॉलम का नाम सत्यापित करें। अन्य बयानों के लिए, खाली उपनाम नामों की तलाश करें। "" या [] के रूप में परिभाषित एलियंस की अनुमति नहीं है। उपनाम को वैध नाम में बदलें। लेबल 'सी' पहले ही घोषित कर दिया गया है। लेबल नाम एक क्वेरी बैच या संग्रहीत प्रक्रिया के भीतर अद्वितीय होना चाहिए .. अपवाद। अपवाद –

+0

[एमडीएसएन के दस्तावेज़] में (https://msdn.microsoft.com/en-us/library/cc281720.aspx), वहां दिया गया उदाहरण है एकल उद्धरण और रिक्त स्थान, वह क्यों है? '$ MyArray =" MyVar1 = 'String1' "," MyVar2 = 'String2' " Invoke-Sqlcmd -Query" SELECT '$ (MyVar1) AS Var1,' $ (MyVar2) AS Var2; " - उपलब्ध $ MyArray' – kate1138

0

सबसे पहले, यदि कोई हो तो त्रुटि संदेश निर्दिष्ट करें।

इसके अलावा, लॉग और डेटा फ़ाइल स्थानों को परिभाषित करने की कोई आवश्यकता नहीं है, नीचे स्निपेट का उपयोग करने का प्रयास करें, यह कई परियोजनाओं में मेरे लिए काम करता है।

$sqlServerName = "%your SQL server instance%" #for example, ".\SQLEXPRESS" 
$file = "C:\yourScript.sql" 
$database = "testDatabaseName" 

$server = New-Object ("Microsoft.SqlServer.Management.Smo.Server") $sqlServerName 
Invoke-SqlCmd -inputfile $file -serverinstance $server -database $database 
+1

हालांकि आवश्यक नहीं है लॉग फ़ाइलों से डेटाबेस फ़ाइलों को अलग करने के लिए यह अच्छा अभ्यास है। –

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