簡體   English   中英

SQL Server代理和SSIS包

[英]SQL Server Agent and SSIS packages

我正在嘗試將SQL Server代理作業中的變量值傳遞給SSIS包,但該變量中包含一個撇號,導致SQL Server代理作業失敗

例如,在作業步驟屬性的SQL Server代理中,我輸入以下詳細信息:

Property Path: \Package.Variables[User::VariableName].Properties[Value] Property 
Value: Michael O'Callaghan.

知道如何解決這個問題嗎?

如果將包部署到SSISDB並從那里執行,請使用SSISDB存儲過程來設置值並轉義引用,就像通過T-SQL一樣。 然后,SQL代理作業可以使用T-SQL腳本代替此步驟。 下面的示例使用set_execution_parameter_value存儲過程來設置此值,並且仍將導致傳入“Michael O'Callaghan”。

DECLARE @execution_id BIGINT
EXEC [SSISDB].[catalog].[create_execution] @package_name=N'Package.dtsx', @execution_id=@execution_id OUTPUT, 
@folder_name=N'Project Folder', @project_name=N'Project', @use32bitruntime=False, @reference_id=Null

DECLARE @var0 SQL_VARIANT = N'Michael O''Callaghan'
EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id,  @object_type=30, @parameter_name=N'Name', @parameter_value=@var0

DECLARE @var1 SMALLINT = 1
EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id,  @object_type=50, @parameter_name=N'LOGGING_LEVEL', @parameter_value=@var1

EXEC [SSISDB].[catalog].[start_execution] @execution_id

逃避它。 只需使用雙撇號。 '' (不是引用" ,而是撇號撇號)

嘗試維護配置文件的標准方法(如果您使用的是2008或更少)並通過文件傳遞變量值。

處理這種情況的另一種方法,坦率地說,我認為最好的方法是使用環境變量。 據我所知,這是在Microsoft推出使用SQL Server 2012作為軟件包部署模型的替代品的項目部署模型時引入的。 程序包部署模型要求在單獨的XML文件中指定程序包參數以部署到服務器。 通過項目部署模型,Microsoft在SQL Server中創建了一個用戶友好的用戶界面來管理它 - XML文件已被刪除。

簡而言之,環境變量允許開發人員將包參數( 而不是包內部的包變量)鏈接到SQL Server,從而在服務器上公開它們。 這使得跨包(例如,連接管理器,FQDN格式的網絡文件夾位置等)存在的相同包參數的管理非常容易管理。 這里的想法是,如果需要將包指向新服務器或新網絡文件夾,那么開發人員只需更改SQL Server中的單個值,然后就可以傳播到所有包, 無需打開,更改和重新打開 - 部署包。

有關如何執行此操作的詳細步驟,請參閱以下參考:

微軟:這有點干,但是從馬的口中是全面的。

SQL Chick:更直觀,並提供截圖,我覺得這很有幫助。

感謝您的所有建議,但不幸的是他們沒有工作,但我為此建立了一個聰明的解決方法。

SQL Server代理在單引號中包裝變量值,例如在sql server agent中指定Jon Doe,代理將其包裝為“Jon Doe”並將其傳遞給SSIS包,因此如果要輸入帶有撇號的值,則打破sql server代理作業並且不會執行SSIS包它看起來像這個EG傳遞這個值:'John O'De'這會導致代理工作中斷所以你需要傳遞你的變量值:John O''Doe和代理包裝如下:'John O'''''Doe'所以你需要在你的SSIS包中加入以下邏輯:

聲明@TempVar nVarchar(50)SET @TempVar = REPLACE(?,''''',CHAR(39))

上面的代碼創建了一個存儲參數值的變量。 它將4個單引號替換為1。 CHAR(39)是單引號的ASCII表示。 這將導致變量值看起來像John O'Doe。 希望這可以幫助。

我之所以要從代理傳遞變量值是因為我必須經常從每次需要部署的SSIS包中更改變量值。 所以這種方式更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM