2011-05-19 88 views
1

我正在使用下面的Powershell代碼來調用將執行一些工作的SP。 SP有動態sql,並且在下面。我從中拉出的文件有數據。事實上,當我直接從SQL運行proc時,它工作正常,所以PS以某種方式不喜歡這個調用。任何人都可以在這裏看到什麼錯唯一我能想到的是動態SQL不會通過PS運行...... ??Powershell:使用動態sql運行存儲過程不起作用

$SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$SqlConnection.ConnectionString = "Server=myserver;Database=Stats;Integrated Security=True" 
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand 
$SqlCmd.CommandText = "spCSVToSQL 'H:\Stats\Stats.csv'" 
$SqlCmd.Connection = $SqlConnection 
$SqlConnection.Open 
$sqlCmd.ExecuteNonQuery 
$SqlConnection.Close 
=================================================================================== 
ALTER procedure [dbo].[spCSVToSQL] @filePath varchar(250) 
as 
Begin 

declare @sql varchar(2500) = 
'CREATE TABLE ##Stats 
(
[StatDate] [varchar](50) NULL, 
[Server] [varchar](50) NULL, 
[DriveLetter] [varchar](50) NULL, 
[Label] [varchar](50) NULL, 
[Capacity] [varchar](50) NULL, 
[FreeSpace] [varchar](50) NULL, 
[PercFree] [varchar](50) NULL, 
[PercFrag] [varchar](50) NULL 
) 
BULK INSERT ##Stats 
FROM ''' + @filePath + ''' 
WITH (FIELDTERMINATOR = '','', FIRSTROW = 2, ROWTERMINATOR = ''\n'') 
INSERT INTO [cStats].[dbo].[StatInfo] 
SELECT Convert(VARCHAR, RTRIM(LTRIM(REPLACE([StatDate], ''"'',''''))), 113) 
     ,CONVERT(VARCHAR, RTRIM(LTRIM(REPLACE([Server], ''"'','''')))) 
     ,CONVERT(VARCHAR, RTRIM(LTRIM(REPLACE([DriveLetter], ''"'','''')))) 
     ,CONVERT(VARCHAR, RTRIM(LTRIM(REPLACE([Label], ''"'','''')))) 
     ,CONVERT(BIGINT, RTRIM(LTRIM(REPLACE([Capacity], ''"'','''')))) 
     ,CONVERT(BIGINT, RTRIM(LTRIM(REPLACE([FreeSpace], ''"'','''')))) 
     ,CONVERT(INT, RTRIM(LTRIM(REPLACE([PercFree], ''"'','''')))) 
     ,CONVERT(INT, RTRIM(LTRIM(REPLACE([PercFrag], ''"'','''')))) 
     FROM ##Stats 

     drop table ##Stats'  
    exec(@sql)  
    End 
+0

「PS以某種方式不喜歡這個電話」不是一個很好的描述正在發生的事情。你能否確切描述你正在觀察的行爲?你有沒有看到任何錯誤?如果是,那麼錯誤信息文本是什麼? – 2011-05-19 22:39:10

回答

2

從您發佈的東西,你缺少在最後三個調用括號:

$SqlConnection.Open() 
$sqlCmd.ExecuteNonQuery() 
$SqlConnection.Close() 

我在這裏測試了你的代碼,它工作正常。這是我做的。

  • 我在Test數據庫中創建了一個StatInfo表,其中架構完全匹配## Stats。我知道,這是不是你的情況,但是這也足以證明,它的作品
  • 我創建了SP的過程是這樣的:

    CREATE procedure [dbo].[spCSVToSQL] @filePath varchar(250) 
    as 
    Begin 
    
    declare @sql varchar(2500) = 
    'CREATE TABLE ##Stats 
    (
    [StatDate] [varchar](50) NULL, 
    [Server] [varchar](50) NULL, 
    [DriveLetter] [varchar](50) NULL, 
    [Label] [varchar](50) NULL, 
    [Capacity] [varchar](50) NULL, 
    [FreeSpace] [varchar](50) NULL, 
    [PercFree] [varchar](50) NULL, 
    [PercFrag] [varchar](50) NULL 
    ) 
    BULK INSERT ##Stats 
    FROM ''' + @filePath + ''' 
    WITH (FIELDTERMINATOR = '','', FIRSTROW = 2, ROWTERMINATOR = ''\n'') 
    INSERT INTO [Test].[dbo].[StatInfo] 
    SELECT Convert(VARCHAR, RTRIM(LTRIM(REPLACE([StatDate], ''"'',''''))), 113) 
         ,CONVERT(VARCHAR, RTRIM(LTRIM(REPLACE([Server], ''"'','''')))) 
         ,CONVERT(VARCHAR, RTRIM(LTRIM(REPLACE([DriveLetter], ''"'','''')))) 
         ,CONVERT(VARCHAR, RTRIM(LTRIM(REPLACE([Label], ''"'','''')))) 
         ,CONVERT(BIGINT, RTRIM(LTRIM(REPLACE([Capacity], ''"'','''')))) 
         ,CONVERT(BIGINT, RTRIM(LTRIM(REPLACE([FreeSpace], ''"'','''')))) 
         ,CONVERT(INT, RTRIM(LTRIM(REPLACE([PercFree], ''"'','''')))) 
         ,CONVERT(INT, RTRIM(LTRIM(REPLACE([PercFrag], ''"'','''')))) 
         FROM ##Stats 
    
         drop table ##Stats'  
        exec(@sql)  
        End 
    
    GO 
    
  • 創建文件C:\ Stats.csv那看起來是這樣的:

    1,2,3,4,5,6,7,8 
    1,2,3,4,5,6,7,8 
    1,2,3,4,5,6,7,8 
    1,2,3,4,5,6,7,8 
    1,2,3,4,5,6,7,8 
    1,2,3,4,5,6,7,8 
    1,2,3,4,5,6,7,8 
    1,2,3,4,5,6,7,8 
    1,2,3,4,5,6,7,8 
    1,2,3,4,5,6,7,8 
    
  • 我跑在PowerShell中的以下內容:

    $SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
    $SqlConnection.ConnectionString = "Server=(local);Database=Test;Integrated Security=True" 
    $SqlCmd = New-Object System.Data.SqlClient.SqlCommand 
    $SqlCmd.CommandText = "spCSVToSQL 'C:\Stats.csv'" 
    $SqlCmd.Connection = $SqlConnection 
    $SqlConnection.Open() 
    $sqlCmd.ExecuteNonQuery() 
    $SqlConnection.Close() 
    
  • 之後我檢查了Test.dbo.StatInfo的內容並確認C:\ Stats.csv中的日期沒有出現。

注意的是,爲了避免名稱衝突可能會更好命名臨時表#Stats而不是##Stats。區別在於##Stats在創建它的連接外部可見,而#Stats不是。

+0

這真是個瘋子! :)我有parens,它給我錯誤。有趣的是,如果你不使用它們並且需要它們,它不會拋出錯誤。我會讓他們回來看看會發生什麼。 – user259286 2011-05-20 00:45:36

0

我從來沒有任何問題運行任何類型的SQL通過Powershell。當「PS以某種方式不喜歡這個電話」時會發生什麼?你有錯誤信息嗎?

1

幾件事情中脫穎而出: 打開和關閉的方式,所以使用parenthis: 即

$ SqlConnection.Open()

包括在CommandText中的 「執行」 聲明: 「EXEC spCSVToSQL 'H:\統計\ Stats.csv'」