2013-05-20 10 views
5

Potrzebuję wykonać skrypt powershella, który wykona skrypt SQL w celu utworzenia bazy danych. Na podstawie mojej wiedzy ja exec polecenia PowerShell w ten sposób:Invoke-Sqlcmd, InputFile i Variable

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" 
} 

skrypt 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 

Zaktualizowałem zmienną $ sqlVariable zgodnie z sugestią @Chad Miller. Więc problem był. Teraz pojawia się ten błąd: Tworzenie błędu bazy danych: Błąd bazy danych: Brak nazwy obiektu lub kolumny lub jest ona pusta. W przypadku instrukcji SELECT INTO sprawdź, czy każda kolumna ma nazwę. W przypadku innych instrukcji szukaj pustych nazw aliasów. Aliasy zdefiniowane jako "" lub [] nie są dozwolone. Zmień alias na poprawną nazwę. Etykieta "C" została już zadeklarowana. Nazwy etykiet muszą być unikalne w obrębie partii zapytania lub procedury składowanej. Wyjątek. Wyjątek

+2

Zdefiniuj "nie działa". Jak dokładnie wynik różni się od oczekiwanego rezultatu? –

+0

Czy możesz dodać twarde zakodowane wartości. "DATABASEFILENAME = MyFileName", "DATABASELOGNAME =" sa "", "DBUSEROWNER =" myUser "" jako test tymczasowy? – granadaCoder

+0

Zaktualizowałem pytanie: –

Odpowiedz

6

Parametr Variable dla Invoke-Sqlcmd cmdletu jest wybredna. Nie umieszczaj spacji przed lub po przypisaniu zmiennych.

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

również trzeba usunąć apostrofów od zmiennych:

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

Masz rację, ale teraz dostałem następujący błąd: Utworzenie błędu bazy danych: Błąd bazy danych: Brak nazwy obiektu lub kolumny lub jest ona pusta. W przypadku instrukcji SELECT INTO sprawdź, czy każda kolumna ma nazwę. W przypadku innych instrukcji szukaj pustych nazw aliasów. Aliasy zdefiniowane jako "" lub [] nie są dozwolone. Zmień alias na poprawną nazwę. Etykieta "C" została już zadeklarowana. Nazwy etykiet muszą być unikalne w obrębie wsadowego zapytania lub procedury składowanej. Wyjątek. Wyjątek –

+0

W [dokumencie MDSN] (https://msdn.microsoft.com/en-us/library/cc281720.aspx) podany tam przykład ma pojedynczy cytat i spacje, dlaczego tak jest? '$ MyArray =" MyVar1 = 'String1' "," MyVar2 = 'String2 "" Invoke-Sqlcmd -Query "SELECT' $ (MyVar1) AS Var1, '$ (MyVar2) AS Var2;" -Zmienna $ MyArray' – kate1138

0

Przede wszystkim należy określić komunikat o błędzie, jeśli występuje.

Ponadto, nie ma potrzeby definiowania lokalizacji plików dziennika i plików danych, spróbuj użyć poniższego fragmentu, działa on dla mnie w wielu projektach.

$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

Chociaż nie jest to wymagane, dobrą praktyką jest oddzielanie plików baz danych od plików dziennika. –