看起来它应该很简单,但到目前为止我还没有找到一种方法将存储在SSIS字符串变量中的值保存到文本文件中。我已经看过在数据流中使用平面文件目的地但需要数据流源。
关于如何做到这一点的任何想法?
答案 0 :(得分:7)
以下是一些在C#中使用SQL CLR的代码示例。如果你在2005年,我需要使用VB我相信。脚本任务还需要将read变量属性设置为MyVariable,以使变量的值可用。
// create a writer and open the file
TextWriter tw = new StreamWriter("\\\\server\\share$\\myfile.txt");
// write a line of text to the file
tw.WriteLine(Dts.Variables["MyVariable"].Value);
// close the stream
tw.Close();
答案 1 :(得分:6)
使用脚本任务。
我刚试过这个。我创建了一个文件连接管理器,连接字符串指向我想写的文件。然后我创建了一个包含要写入的文本的字符串变量。
我添加了一个Script Task,在Read Only Variables列表中指定了我的字符串变量,然后单击Edit Script。脚本如下:
public void Main()
{
ConnectionManager cm = Dts.Connections["File.tmp"];
var path = cm.ConnectionString;
var textToWrite = (string)Dts.Variables["User::StringVariable"].Value;
System.IO.File.WriteAllText(path, textToWrite);
Dts.TaskResult = (int)ScriptResults.Success;
}
这没有问题。
答案 2 :(得分:3)
所需要的只是简单脚本任务中的一行代码。不需要其他依赖项,例如连接管理器。
这是C#中的样子:
public void Main()
{
string variableValue = Dts.Variables["TheVariable"].Value.ToString();
string outputFile = Dts.Variables["Path"].Value.ToString();
System.IO.File.WriteAllText(outputFile, variableValue);
Dts.TaskResult = (int)ScriptResults.Success;
}
显然,这里最重要的一行是包含WriteAllText函数调用的那一行。
Path变量应包含输出文件的完整路径+文件名。
答案 3 :(得分:1)
好的,我有一个不涉及使用脚本任务的答案。选择一些您拥有的oledb sql源代码,它很简单并且您可以控制很多。进行仅返回一行的查询。然后将此查询放入字符串变量中: “从表中选择vara,'nnnn“ + @ [User:varIWantToSee] +”'myvar,其中vara = 1” 然后在OLEDB源代码中选择“来自变量的SQL命令” 对于varIWantToSee,请确保使用很多字符对其进行初始化,否则ssis会使该列的长度非常小,并且不允许您覆盖。在运行时,将设置varIWantToSee,您可以看到它。将所有内容都抽到一个平面文件目标位置,您就可以从事业务。为什么有些人必须这样做?由于某些人需要了解运行时环境中变量的值,因此他们的笔记本电脑开发不会显示所需的变量值。就我而言,我是在具有我需要测试的数据库访问权限的Azure环境上运行此操作。如果我是microsoft,我将创建一个任务,通过将其写入程序包运行时创建的sis日志文件中,以显示作业在该阶段的运行时变量值。如果有人知道该怎么做,请启发我们。
答案 4 :(得分:0)
可以使用派生列转换将变量的值写入列。问题是它需要一个源来驱动它,并且没有可以使用的库存数据源只是在管道上吐出一个空行。
因此,要么重新调整单行源以驱动派生列转换,要么执行另一个答案建议,并使用脚本源执行此操作。
答案 5 :(得分:0)
我按照你描述的方式做到了。我已经定义了oledb连接管理器,所以我使用了 OLE DB Source 并使用了SQL Command数据访问模式。我使用了一个简单的查询:
select getdate() as dt
......只是为了让它脱离困境。现在我知道变量拉动的日期了。然后我使用Derived Column Transform来使我的包变量可用并将其写入平面文件。
优雅?不,但它完成了工作。
答案 6 :(得分:0)
让我们假设你不想搞乱脚本任务而你没有可以连接的数据库只是为了发出一个数据源命令,如:
SELECT 'Some arbitrary text'
仍然有几种方法可以将Process任务用于将一行文本写入文件这样简单的事情。例如,您可以将PowerShell与使用以下表达式构建的输入变量一起使用:
"'"+REPLACE(@[User::Text],"'","''")+"' > '"+REPLACE(@[User::Filename],"'","''")+"'"
注意我转义了文件名,因为单引号在那里是合法的。另请注意我使用'>'用于重定向,如果文件存在则覆盖该文件。如果我想追加,我会使用'>>'。
当User :: Text包含多行时,我最初遇到此方法的问题。事实证明,当命令跨越行时,您需要在文件名后面添加一些额外的EOL字符。像这样:
"'"+REPLACE(@[User::Text],"'","''")+"' > '"+REPLACE(@[User::Filename],"'","''")+"'\r\n\r\n"
将cmd.exe与echo结合使用会更加不稳定,但在某些情况下也可以工作,并且开销也会少得多。
P.S。我注意到PowerShell的某些版本会忽略StandardInputVariable内容而不用这个:
-Command -
<参数>框中的。作为Command参数的单独减号是“魔术”并记录在https://docs.microsoft.com/en-us/powershell/scripting/powershell.exe-command-line-help。我相信所有版本的PowerShell都接受这个参数,所以即使你的版本不需要它,你也可以想要包含它,因为它不应该破坏任何东西,如果PowerShell更新到需要它的版本,可能会使你的代码无法破坏。 / p>