2017-10-12 23 views
0

bcpコマンドを組み合わせて、ストアドプロシージャの最後にファイルを出力します。SQL Server BCPコマンド

以下のコードを実行し、変数の内容を選択してEXEC xp_cmdshellを先頭に追加すると、正常に動作します。私はすなわちEXEC xp_cmdshell @cmdを介してすべての方法でそれを実行した場合

、私はエラーを取得しています

内部または外部コマンドとして認識されていない「BCP」は

私は場所を確認することはできません私のコードが間違っている、誰も問題を参照してくださいできますか?

DECLARE @PeriodStamp VARCHAR(8000) = REPLACE(CAST(GETDATE() - 2 AS DATE), '-', '') 

DECLARE @marketingoptinp1 VARCHAR(8000) = '''bcp "select ''''Created_DateTime'''', ''''Application_Date'''', ''''Application_ID'''', ''''Customer_ID'''', ''''First_Name'''', ''''Last_Name'''', ''''Email'''', ''''Mobile_Phone'''', ''''Home_Phone'''', ''''Gender'''', ''''DOB'''', ''''AGE'''', ''''Marital_Status_ID'''', ''''Marital_Status_Desc'''', ''''Dependent_Number'''', ''''Dependent_Number_Desc'''', ''''Employment_Industry_ID'''', ''''Employment_Industry_Desc'''', ''''Income_Source_ID'''', ''''Income_Source_Desc'''', ''''Loan_Amount'''', ''''Loan_Purpose_ID'''', ''''Loan_Purpose_Desc'''', ''''Residence_Type_ID'''', ''''Residence_Type_Desc'''', ''''Postcode'''', ''''Address1'''', ''''Address2'''', ''''City'''', ''''County'''', ''''Marketing_Opt_In'''', ''''IP_Address'''', ''''Bank_Sort_Code'''', ''''Device'''', ''''Lender_Result'''', ''''Rental_Mortgage_Payments'''', ''''Has_Pension'''', ''''PeriodStamp'''' union all SELECT Created_DateTime, cast(Application_Date as nvarchar(10)) as Application_Date, cast(Application_ID as nvarchar(15)) as Application_ID, cast(Customer_ID as nvarchar(15)) as Customer_ID , cast(First_Name as varchar(150)) as First_Name , cast(Last_Name as varchar(150)) as Last_Name , cast(Email as varchar(250)) as Email , quintegrity.[dbo].[udf_AlphaNumericElement](Mobile_Phone,4) as Mobile_Phone , quintegrity.[dbo].[udf_AlphaNumericElement](Home_Phone,4) as Home_Phone , Gender, cast(DOB as nvarchar(15)) as DOB, cast(AGE as nvarchar(3)) as AGE, cast(Marital_Status_ID as nvarchar(2)) as Marital_Status_ID, Marital_Status_Desc, cast(Dependent_Number as nvarchar(20)) as Dependent_Number, Dependent_Number_Desc, cast(Employment_Industry_ID as nvarchar(10)) as Employment_Industry_ID, Employment_Industry_Desc, cast(Income_Source_ID as nvarchar(10)), Income_Source_Desc, cast(Loan_Amount as nvarchar(20)) as Loan_Amount, cast(Loan_Purpose_ID as nvarchar(6)) as Loan_Purpose_ID, Loan_Purpose_Desc, cast(Residence_Type_ID as nvarchar(6)) as Residence_Type_ID, Residence_Type_Desc , cast(Postcode as varchar(150)) Postcode , cast(Address1 as varchar(150)) Address1 , cast(Address2 as varchar(150)) Address2 , cast(City as varchar(150)) City , cast(County as varchar(150)) County , cast(Marketing_Opt_In as nvarchar(2)) as Marketing_Opt_In, cast(IP_Address as nvarchar(20)) as IP_Address, cast(Bank_Sort_Code as nvarchar(10)) as Bank_Sort_Code, Device, Lender_Result, cast(Rental_Mortgage_Payments as nvarchar(15)) as Rental_Mortgage_Payments, Has_Pension, PeriodStamp FROM scratch.dbo.data_extract where Marketing_Opt_In = 1 and PeriodStamp = ' + @PeriodStamp 

DECLARE @marketingoptinp2 VARCHAR(8000) 
SET @marketingoptinp2 = ' " queryout "C:\test\data' + @PeriodStamp+'.txt" -T -c''' 

DECLARE @cmd VARCHAR(8000) 
SET @cmd = @marketingoptinp1 + @marketingoptinp2 

EXEC xp_cmdshell @cmd 
+0

良い。 bcpはコマンドラインツールです。 *コマンドラインから実行する*、セキュリティを破るだけで*サーバ*がスクリプトを実行できるようにしないでください。これを定期的に実行する場合や、しばらくしてからSQL Serverエージェントジョブを作成する場合 –

+0

*データをエクスポートする場合は、SSISを使用するか、実際にReporting Servicesで適切なレポートを作成してください。 'xp_cmdshell'を実行するためにセキュリティ機能を無効にしなければならないこと、文字列を連結してSQLインジェクション攻撃を許可することなど、SQL Serverのアカウントを使って任意のコマンドを実行できるようになります。 –

答えて

0

変数を介して渡された文字列、それはこのようにする必要があり 、あなたがやった方法で、二重引用符で囲む必要はありません。

DECLARE @marketingoptinp1 VARCHAR(8000) = 'bcp "select Created_DateTime, Application_Date, Application_ID, Customer_ID, First_Name, Last_Name, Email, Mobile_Phone, Home_Phone, Gender, DOB, AGE, Marital_Status_ID, Marital_Status_Desc, Dependent_Number, Dependent_Number_Desc, Employment_Industry_ID, Employment_Industry_Desc, Income_Source_ID, Income_Source_Desc, Loan_Amount, Loan_Purpose_ID, Loan_Purpose_Desc, Residence_Type_ID, Residence_Type_Desc, Postcode, Address1, Address2, City, County, Marketing_Opt_In, IP_Address, Bank_Sort_Code, Device, Lender_Result, Rental_Mortgage_Payments, Has_Pension, PeriodStamp union all SELECT Created_DateTime, cast(Application_Date as nvarchar(10)) as Application_Date, cast(Application_ID as nvarchar(15)) as Application_ID, cast(Customer_ID as nvarchar(15)) as Customer_ID , cast(First_Name as varchar(150)) as First_Name , cast(Last_Name as varchar(150)) as Last_Name , cast(Email as varchar(250)) as Email , quintegrity.[dbo].[udf_AlphaNumericElement](Mobile_Phone,4) as Mobile_Phone , quintegrity.[dbo].[udf_AlphaNumericElement](Home_Phone,4) as Home_Phone , Gender, cast(DOB as nvarchar(15)) as DOB, cast(AGE as nvarchar(3)) as AGE, cast(Marital_Status_ID as nvarchar(2)) as Marital_Status_ID, Marital_Status_Desc, cast(Dependent_Number as nvarchar(20)) as Dependent_Number, Dependent_Number_Desc, cast(Employment_Industry_ID as nvarchar(10)) as Employment_Industry_ID, Employment_Industry_Desc, cast(Income_Source_ID as nvarchar(10)), Income_Source_Desc, cast(Loan_Amount as nvarchar(20)) as Loan_Amount, cast(Loan_Purpose_ID as nvarchar(6)) as Loan_Purpose_ID, Loan_Purpose_Desc, cast(Residence_Type_ID as nvarchar(6)) as Residence_Type_ID, Residence_Type_Desc , cast(Postcode as varchar(150)) Postcode , cast(Address1 as varchar(150)) Address1 , cast(Address2 as varchar(150)) Address2 , cast(City as varchar(150)) City , cast(County as varchar(150)) County , cast(Marketing_Opt_In as nvarchar(2)) as Marketing_Opt_In, cast(IP_Address as nvarchar(20)) as IP_Address, cast(Bank_Sort_Code as nvarchar(10)) as Bank_Sort_Code, Device, Lender_Result, cast(Rental_Mortgage_Payments as nvarchar(15)) as Rental_Mortgage_Payments, Has_Pension, PeriodStamp FROM scratch.dbo.data_extract where Marketing_Opt_In = 1 and PeriodStamp = ' + @PeriodStamp 

2番目の変数に同じこと、あなたは終了2を削除する必要があります見積もり:

DECLARE @marketingoptinp2 VARCHAR(8000) 
SET @marketingoptinp2 = ' " queryout "C:\test\data' + @PeriodStamp+'.txt" -T -c' 
+0

こんにちは、回答いただきありがとうございます、私はあなたが示唆したようにしていますが、出力を実行するとエラーが発生します。bcp:unknownオプション ' – PJD

+0

@PJDこれは2番目の変数に別の二重引用符があるためです今、私の更新された答えを見てください – sepupic

関連する問題