我正在尝试使用Windows PowerShell将我的一个查询转换为自动脚本,并且我遇到了某些错误的问题。以下是我收到的错误示例:
Exception calling "Fill" with "1" argument(s): "Incorrect syntax near the keyword 'Declare'.
Incorrect syntax near '='."
At C:\Users\vwebster\Documents\Canada\GetCASMGSTD.ps1:60 char:17
+ $a = $SqlAdapter.Fill($DataSet)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : SqlException
我要做的是查询数据库的MINIMUM DATE并使用该MIN Date来检索数据。似乎是我的语法问题。
下面是我写的用于查询数据库的xml查询。有人能让我理解我在这里做错了什么吗?这是我的查询的一个方面,但实际上总共有大约3个单独的查询我试图一次运行和UNION ALL结果将它们全部编译成1个结果。您将在下面看到我尝试使用的完整查询。有人可以帮助我理解如何编写此查询并使其在PowerShell中工作吗?
查询的第一部分
SQLQuery ="
Declare @monthfrom varchar
select @monthfrom = CAST(REPLACE( CONVERT(VARCHAR(7), DATEADD(mm,-36,GETDATE()), 120),'-','') AS int)FROM [mediao0].[dbo].[SPSBUYLINESPOT]
select
'DDS-A-CA' as LocalMediaSystemName,
'CA' as SourceCountry,
unit.agency as AgencyCode,
'STARCOM WORLDWIDE' as AgencyName,
unit.client as ClientCode,
client.name as ClientName,
'' as ClientBrandCode,
'' as ClientBrandName,
BUYLINESPOT.product as ProductCode,
product.name as ProductName,
'' as FolioCode,
'' as FolioName,
'' as ParentVendorCode,
'' as ParentVendorName,
unit.station as VendorCode,
'' as VendorName,
unit.estimate as CampaignCode,
' ' as CampaignName,
'' as CampaignType,
unit.media as MediaTypeCode,
'Radio'as MediaTypeName,
'' as SubMediaTypeCode,
'' as SubMediaTypeName,
unit.market as MarketCode,
market.name as MarketName,
'' as ProgramCode,
unit.programname as ProgramName,
unit.daypartcode as Daypart,
'' as TargetAudience,
'' as BuyID,
cast(unit.seconds as NCHAR) as UnitSizeCode,
cast(unit.seconds as NCHAR) UnitSizeName,
'' as DigitalAdFormat,
'' as Position,
convert(varchar(10), buylinespot.spotdate,120)as ScheduledRunDateStart,
'' as ScheduledRunDateEnd,
convert ( varchar(8), buylinespot.AffidavitDateTime,108) as ScheduledStartTime,
'' as ScheduledEndTime,
convert(varchar(10), buylinespot.affidavitdatetime,120)as ActualRunDateStart,
'' as ActualRunDateEnd,
convert ( varchar(8), buylinespot.AffidavitDateTime,108) as ActualStartTime,
'UTC-4' as TimeSMGne,
'' as URL,
'' as PlacementID,
'' as PlacementName,
'' as AdServerName,
'' as AdServerSiteID,
'' as AdServerPlacementID,
'' as AdServerCampaignID,
'' as IsBilled,
'' as BillDate,
'' as IsPaid,
'' as PaidDate,
'CAD' as CurrencyCode,
buylinespot.Cost as GrossSpend,
buylinespot.Cost * .85 as NetSpend,
'' as NWMFlag,
'' as VPVH,
'' as HouseholdAvgRating,
'' as CPM,
'' as EstimatedImpressions,
'' as EstimatedGRPs,
'' as ActualImpressions,
'' as ActualGRPs,
'' as GenericField1,
'' as GenericField2,
'' as GenericField3,
'' as GenericField4,
'' as GenericField5,
'' as GenericField6
from mediao0.dbo.SPSBUYLINE UNIT,
mediao0.dbo.SPSBUYLINESPOT BUYLINESPOT,
mediao0.dbo.SPSCLIENT client,
mediao0.dbo.SPSPRODUCT product,
mediao0.dbo.SPSMARKET market
WHERE UNIT.AGENCY = BUYLINESPOT.AGENCY
AND UNIT.BuyID = BUYLINESPOT.BuyID
and buylinespot.agency = client.AGENCY
and unit.Media = client.MEDIA
and unit.Client = client.CLIENT
and unit.agency = product.agency
and unit.media = product.media
and unit.client = product.client
and BUYLINESPOT.product = product.product
and unit.agency = market.agency
and unit.media = market.media
and unit.market = market.market
and unit.media = 'r'
and buylinespot.Cost < > 0
and convert(varchar(10), buylinespot.spotdate,120) >= @monthfrom
完整查询
SQLQuery ="
Declare @monthfrom varchar
Select @monthfrom = CAST(REPLACE( CONVERT(VARCHAR(7), DATEADD(mm,-36,GETDATE()), 120),'-','') AS int)FROM [mediao0].[dbo].[SPSBUYLINESPOT]
select
'DDS-A-CA' as LocalMediaSystemName,
'CA' as SourceCountry,
unit.agency as AgencyCode,
'STARCOM WORLDWIDE' as AgencyName,
unit.client as ClientCode,
client.name as ClientName,
'' as ClientBrandCode,
'' as ClientBrandName,
BUYLINESPOT.product as ProductCode,
product.name as ProductName,
'' as FolioCode,
'' as FolioName,
'' as ParentVendorCode,
'' as ParentVendorName,
unit.station as VendorCode,
'' as VendorName,
unit.estimate as CampaignCode,
' ' as CampaignName,
'' as CampaignType,
unit.media as MediaTypeCode,
'Radio'as MediaTypeName,
'' as SubMediaTypeCode,
'' as SubMediaTypeName,
unit.market as MarketCode,
market.name as MarketName,
'' as ProgramCode,
unit.programname as ProgramName,
unit.daypartcode as Daypart,
'' as TargetAudience,
'' as BuyID,
cast(unit.seconds as NCHAR) as UnitSizeCode,
cast(unit.seconds as NCHAR) UnitSizeName,
'' as DigitalAdFormat,
'' as Position,
convert(varchar(10), buylinespot.spotdate,120)as ScheduledRunDateStart,
'' as ScheduledRunDateEnd,
convert ( varchar(8), buylinespot.AffidavitDateTime,108) as ScheduledStartTime,
'' as ScheduledEndTime,
convert(varchar(10), buylinespot.affidavitdatetime,120)as ActualRunDateStart,
'' as ActualRunDateEnd,
convert ( varchar(8), buylinespot.AffidavitDateTime,108) as ActualStartTime,
'UTC-4' as TimeSMGne,
'' as URL,
'' as PlacementID,
'' as PlacementName,
'' as AdServerName,
'' as AdServerSiteID,
'' as AdServerPlacementID,
'' as AdServerCampaignID,
'' as IsBilled,
'' as BillDate,
'' as IsPaid,
'' as PaidDate,
'CAD' as CurrencyCode,
buylinespot.Cost as GrossSpend,
buylinespot.Cost * .85 as NetSpend,
'' as NWMFlag,
'' as VPVH,
'' as HouseholdAvgRating,
'' as CPM,
'' as EstimatedImpressions,
'' as EstimatedGRPs,
'' as ActualImpressions,
'' as ActualGRPs,
'' as GenericField1,
'' as GenericField2,
'' as GenericField3,
'' as GenericField4,
'' as GenericField5,
'' as GenericField6
from mediao0.dbo.SPSBUYLINE UNIT,
mediao0.dbo.SPSBUYLINESPOT BUYLINESPOT,
mediao0.dbo.SPSCLIENT client,
mediao0.dbo.SPSPRODUCT product,
mediao0.dbo.SPSMARKET market
WHERE UNIT.AGENCY = BUYLINESPOT.AGENCY
AND UNIT.BuyID = BUYLINESPOT.BuyID
and buylinespot.agency = client.AGENCY
and unit.Media = client.MEDIA
and unit.Client = client.CLIENT
and unit.agency = product.agency
and unit.media = product.media
and unit.client = product.client
and BUYLINESPOT.product = product.product
and unit.agency = market.agency
and unit.media = market.media
and unit.market = market.market
and unit.media = 'r'
and buylinespot.Cost < > 0
and convert(varchar(10), buylinespot.spotdate,120) >= @monthfrom
UNION ALL
select
'DDS-A-CA' as LocalMediaSystemName,
'CA' as SourceCountry,
unit.agency as AgencyCode,
'STARCOM WORLDWIDE' as AgencyName,
unit.client as ClientCode,
client.name as ClientName,
'' as ClientBrandCode,
'' as ClientBrandName,
BUYLINESPOT.product as ProductCode,
product.name as ProductName,
'' as FolioCode,
'' as FolioName,
'' as ParentVendorCode,
'' as ParentVendorName,
unit.station as VendorCode,
'' as VendorName,
unit.estimate as CampaignCode,
'' as CampaignName,
'' as CampaignType,
unit.media as MediaTypeCode,
'Spot TV' as MediaTypeName,
'' as SubMediaTypeCode,
'' as SubMediaTypeName,
unit.market as MarketCode,
market.name as MarketName,
'' as ProgramCode,
unit.programname as ProgramName,
unit.daypartcode as Daypart,
'' as TargetAudience,
'' as BuyID,
cast(unit.seconds as NCHAR) as UnitSizeCode,
cast(unit.seconds as NCHAR) UnitSizeName,
'' as DigitalAdFormat,
'' as Position,
convert(varchar(10), buylinespot.spotdate,120)as ScheduledRunDateStart,
'' as ScheduledRunDateEnd,
convert ( varchar(8), buylinespot.AffidavitDateTime,108) as ScheduledStartTime,
'' as ScheduledEndTime,
convert(varchar(10), buylinespot.affidavitdatetime,120)as ActualRunDateStart,
'' as ActualRunDateEnd,
convert ( varchar(8), buylinespot.AffidavitDateTime,108) as ActualStartTime,
'UTC-4' as TimeSMGne,
'' as URL,
'' as PlacementID,
'' as PlacementName,
'' as AdServerName,
'' as AdServerSiteID,
'' as AdServerPlacementID,
'' as AdServerCampaignID,
'' as IsBilled,
'' as BillDate,
'' as IsPaid,
'' as PaidDate,
'CAD' as CurrencyCode,
buylinespot.Cost as GrossSpend,
buylinespot.Cost * .85 as NetSpend,
'' as NWMFlag,
'' as VPVH,
'' as HouseholdAvgRating,
'' as CPM,
'' as EstimatedImpressions,
'' as EstimatedGRPs,
'' as ActualImpressions,
'' as ActualGRPs,
'' as GenericField1,
'' as GenericField2,
'' as GenericField3,
'' as GenericField4,
'' as GenericField5,
'' as GenericField6
from mediao0.dbo.SPSBUYLINE UNIT,
mediao0.dbo.SPSBUYLINESPOT BUYLINESPOT,
mediao0.dbo.SPSCLIENT client,
mediao0.dbo.SPSPRODUCT product,
mediao0.dbo.SPSMARKET market
WHERE UNIT.AGENCY = BUYLINESPOT.AGENCY
AND UNIT.BuyID = BUYLINESPOT.BuyID
and buylinespot.agency = client.AGENCY
and unit.Media = client.MEDIA
and unit.Client = client.CLIENT
and unit.agency = product.agency
and unit.media = product.media
and unit.client = product.client
and BUYLINESPOT.product = product.product
and unit.agency = market.agency
and unit.media = market.media
and unit.market = market.market
and unit.media = 'T'
and buylinespot.Cost < > 0
and convert(varchar(10), buylinespot.spotdate,120) >= @monthfrom
union all
select
'DDS-A-CA' as LocalMediaSystemName,
'CA' as SourceCountry,
unit.agency as AgencyCode,
'STARCOM WORLDWIDE' as AgencyName,
unit.client as ClientCode,
client.name as ClientName,
'' as ClientBrandCode,
'' as ClientBrandName,
BUYLINESPOT.product as ProductCode,
product.name as ProductName,
'' as FolioCode,
'' as FolioName,
'' as ParentVendorCode,
'' as ParentVendorName,
unit.station as VendorCode,
'' as VendorName,
unit.estimate as CampaignCode,
'' as CampaignName,
'' as CampaignType,
unit.media as MediaTypeCode,
'Network TV' as MediaTypeName,
'' as SubMediaTypeCode,
'' as SubMediaTypeName,
unit.market as MarketCode,
market.name as MarketName,
'' as ProgramCode,
unit.programname as ProgramName,
unit.daypartcode as Daypart,
'' as TargetAudience,
'' as BuyID,
cast(unit.seconds as NCHAR) as UnitSizeCode,
cast(unit.seconds as NCHAR) UnitSizeName,
'' as DigitalAdFormat,
'' as Position,
convert(varchar(10), buylinespot.spotdate,120)as ScheduledRunDateStart,
'' as ScheduledRunDateEnd,
convert ( varchar(8), buylinespot.AffidavitDateTime,108) as ScheduledStartTime,
'' as ScheduledEndTime,
convert(varchar(10), buylinespot.affidavitdatetime,120)as ActualRunDateStart,
'' as ActualRunDateEnd,
convert ( varchar(8), buylinespot.AffidavitDateTime,108) as ActualStartTime,
'UTC-4' as TimeSMGne,
'' as URL,
'' as PlacementID,
'' as PlacementName,
'' as AdServerName,
'' as AdServerSiteID,
'' as AdServerPlacementID,
'' as AdServerCampaignID,
'' as IsBilled,
'' as BillDate,
'' as IsPaid,
'' as PaidDate,
'CAD' as CurrencyCode,
buylinespot.Cost as GrossSpend,
buylinespot.Cost * .85 as NetSpend,
'' as NWMFlag,
'' as VPVH,
'' as HouseholdAvgRating,
'' as CPM,
'' as EstimatedImpressions,
'' as EstimatedGRPs,
'' as ActualImpressions,
'' as ActualGRPs,
'' as GenericField1,
'' as GenericField2,
'' as GenericField3,
'' as GenericField4,
'' as GenericField5,
'' as GenericField6
from mediao0.dbo.SPSBUYLINE UNIT,
mediao0.dbo.SPSBUYLINESPOT BUYLINESPOT,
mediao0.dbo.SPSCLIENT client,
mediao0.dbo.SPSPRODUCT product,
mediao0.dbo.SPSMARKET market
WHERE UNIT.AGENCY = BUYLINESPOT.AGENCY
AND UNIT.BuyID = BUYLINESPOT.BuyID
and buylinespot.agency = client.AGENCY
and unit.Media = client.MEDIA
and unit.Client = client.CLIENT
and unit.agency = product.agency
and unit.media = product.media
and unit.client = product.client
and BUYLINESPOT.product = product.product
and unit.agency = market.agency
and unit.media = market.media
and unit.market = market.market
and unit.media = 'n'
and buylinespot.Cost < > 0
and convert(varchar(10), buylinespot.spotdate,120) >= @monthfrom
union all
select
'DDS-A-CA' as LocalMediaSystemName,
'CA' as SourceCountry,
unit.agency as AgencyCode,
'STARCOM WORLDWIDE' as AgencyName,
unit.client as ClientCode,
client.name as ClientName,
'' as ClientBrandCode,
'' as ClientBrandName,
unit.product as ProductCode,
product.name as ProductName,
'' as FolioCode,
'' as FolioName,
'' as ParentVendorCode,
'' as ParentVendorName,
unit.PUBNUMBER + unit.PUBEDITION + unit.PUBZONE as VendorCode,
pub.name as VendorName,
unit.estimate as CampaignCode,
'' as CampaignName,
'' as CampaignType,
unit.media as MediaTypeCode,
media.medianame as MediaTypeName,
'' as SubMediaTypeCode,
'' as SubMediaTypeName,
'' as MarketCode,
pub.city + ' ' + pub.state as MarketName,
'' as ProgramCode,
'' as ProgramName,
'' as Daypart,
'' as TargetAudience,
'' as BuyID,
'' as UnitSizeCode,
unit.SPACEDESCRIPTION as UnitSizeName,
'' as DigitalAdFormat,
'' as Position,
convert(varchar(10), unit.INSERTIONDATE,120)as ScheduledRunDateStart,
'' as ScheduledRunDateEnd,
'' as ScheduledStartTime,
'' as ScheduledEndTime,
'' as ActualRunDateStart,
'' as ActualRunDateEnd,
'' as ActualStartTime,
'UTC-4' as TimeSMGne,
'' as URL,
'' as PlacementID,
'' as PlacementName,
'' as AdServerName,
'' as AdServerSiteID,
'' as AdServerPlacementID,
'' as AdServerCampaignID,
'' as IsBilled,
'' as BillDate,
'' as IsPaid,
'' as PaidDate,
'CAD' as CurrencyCode,
SUMM.gross as GrossSpend,
summ.gross * .85 as NetSpend,
'' as NWMFlag,
'' as VPVH,
'' as HouseholdAvgRating,
'' as CPM,
'' as EstimatedImpressions,
'' as EstimatedGRPs,
'' as ActualImpressions,
'' as ActualGRPs,
'' as GenericField1,
'' as GenericField2,
'' as GenericField3,
'' as GenericField4,
'' as GenericField5,
'' as GenericField6
from mediao0.dbo.PPSBUY UNIT,
mediao0.dbo.PPSBUYSUMMARY SUMM,
mediao0.dbo.PPSCLIENT client,
mediao0.dbo.PPSMEDIA media,
mediao0.dbo.PPSPRODUCT product,
mediao0.dbo.PPSPUB PUB
WHERE UNIT.AGENCY = SUMM.AGENCY
AND UNIT.media = SUMM.media
and UNIT.client = SUMM.client
AND UNIT.serial = SUMM.SERIAL
and unit.PRODUCT = summ.PRODUCT
and summ.ISBUYLINETOTAL = 'y'
and unit.agency = client.AGENCY
and unit.Media = client.MEDIA
and unit.Client = client.CLIENT
and unit.agency = media.agency
and unit.media = media.media
and unit.agency = product.agency
and unit.media = product.media
and unit.client = product.client
and unit.product = product.product
and unit.agency = PUB.agency
and unit.media = PUB.media
and unit.pubnumber = PUB.pubnumber
and unit.pubzone = pub.pubzone
and unit.PUBEDITION = pub.PUBEDITION
and unit.ISDELETED = 'n'
and unit.ISTEST = 'n'
and convert(varchar(10), unit.INSERTIONDATE,120) >= @monthfrom;
"
/>
</Query_this>
.ps1脚本
$cfgFile = ".\CASMGSTD (3).xml"
$root = "Query_this"
$cfg = [xml] ( gc $cfgFile )
$datestr = Get-Date -format yyyyMMdd
$startdate =[datetime]::today.Addmonths(-13)
$Date="'"+$startdate.tostring()+"'"
$startdatestr= '{0:yyyyMMdd}' -f $startdate
$SqlServer = $cfg.$root.SQL.Server
$User= $cfg.$root.SQL.User
$PWD = $cfg.$root.SQL.PWD
$FTPUser = $cfg.$root.SQL.FTPu
$FTPpw = $cfg.$root.SQL.FTPpw
$Database = $cfg.$root.SQL.DataBase
$FileLocation = $cfg.$root.SQL.FileLocation
$SQLQuery = $cfg.$root.SQL.SQLQuery
$SQLQuery = $SQLQuery.replace("@monthfrom",$monthfrom)
$File = "CA_DDS_A_"+$startdatestr+"_"+$datestr+"_"+$datestr+".txt"
$FileName = $FileLocation+$File
$writer = new-object System.IO.StreamWriter($FileName)
function Run-Query()
{
param (
$SqlQuery,
$SqlServer,
$SqlCatalog,
$SqlUser,
$SqlPass
)
if ($SqlUser)
{
$SqlConnString = "Server=$SqlServer;Database=$SqlCatalog;user=$SqlUser;password=$SqlPass"
} else
{
$SqlConnString = "Server=$SqlServer;Database=$SqlCatalog;Integrated Security=SSPI"
}
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = $SqlConnString
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = $SqlQuery
$SqlCmd.Connection = $SqlConnection
$SqlCmd.CommandTimeout= 0
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$a = $SqlAdapter.Fill($DataSet)
$SqlConnection.Close()
#$DataSet.Tables | Select-Object -ExpandProperty Rows
return ,$DataSet.Tables[0]
}
$dt = new-object System.Data.DataTable
$dt = Run-Query -SqlQuery $SQLQuery -SqlServer $SqlServer -SqlCatalog $Database -SqlUser $User -SqlPass $PWD
##$dt | export-csv .\$FileName -notypeinformation
$columns =@()
foreach ($col in $dt.columns)
{
##$col | GET-member
$columns = $columns + $col.ColumnName
}
$header = [string]::join("`t",$columns)
##Write-Output $header
$writer.writeline($header)
foreach ($row in $dt.rows)
{
$data = @()
foreach ($col in $dt.columns)
{
if([DBNULL]::Value -eq $row[$col])
{ $point ="NULL"}
ELSE {$point =$row[$col]}
$data = $data + $point
}
$line = [string]::join("`t",$data)
$writer.writeline($line)
##Write-Output $line
}
$writer.Close()
$ftp = "ftp://@ftp.vivakiondemand.com/rootdir/$File"
$ftp
$webclient = New-Object System.Net.WebClient
$webclient.Credentials = New-Object System.Net.NetworkCredential($FTPuser,$FTPpw)
$uri = New-Object System.Uri($ftp)
"Uploading $File..."
$webclient.UploadFile($uri, $FileName)
答案 0 :(得分:0)
根据您评论中的其他代码,我认为最好的解决方案是使用参数化查询替换SQL中局部变量的使用。如您所述,您正在进行字符串替换以将@monthfrom的值与PowerShell变量的值进行交换。虽然这有效,但这不是一个好的或安全的方法。
您的代码需要进行一些更改才能解决此问题。首先,从SQL查询中删除以下行。您不需要声明局部变量,我们将在其位置使用查询参数。
Declare @monthfrom varchar
select @monthfrom = CAST(REPLACE( CONVERT(VARCHAR(7), DATEADD(mm,-36,GETDATE()), 120),'-','') AS int)FROM [mediao0].[dbo].[SPSBUYLINESPOT]
然后,从PS1文件中删除此行:
$SQLQuery = $SQLQuery.replace("@monthfrom",$monthfrom)
然后在设置命令timeout的代码后将这些行添加到PS1文件中:
$SqlCmd.CommandType = Text
$SqlCmd.Parameters.AddWithValue("@monthfrom", $monthfrom)
这将允许将$monthno
的值与您的查询一起传递给服务器以供执行。