Powershell:使用动态sql运行存储过程无效

时间:2011-05-19 21:39:17

标签: sql powershell

我正在使用下面的Powershell代码来调用将执行某些操作的SP。 SP有动态sql,位于下方。我正在提取的文件存在且有数据。事实上,当我直接从SQL运行proc它工作正常,所以PS不知何故不喜欢这个调用。谁能在这里看到任何错误?我唯一能想到的是动态SQL不能通过PS运行......?

$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

3 个答案:

答案 0 :(得分: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则不是。{/ p>

答案 1 :(得分:1)

有几点突出: 打开和关闭是方法,所以使用parenthis: 即。

$ SqlConnection.Open()

在commandtext中包含一个“exec”语句: “exec spCSVToSQL'H:\ Stats \ Stats.csv'”

答案 2 :(得分:0)

我通过Powershell运行任何类型的SQL都没有任何问题。当“PS某种程度上不喜欢这个电话”时会发生什么?你收到错误信息吗?