none
SSIS中有关变量菜鸟级问题 RRS feed

  • 问题

  • 各位:请教一个问题。我想将数百个txt标准文本文件导入到SQL2012某个数据库中,以各txt文本文件名命名作为数据库中表名,一次性将其导入到SQL数据库。

    利用Integration Services,foreach循环,选择平面文件源,目标是OLDEDB。循环体中,可以利用枚举变量作为conectingstring动态调整导入源连接,但是问题是,

    无法根据用户变量的值,采用截取字符串等方法来确定目标表格名称。

    请各位指教,万分感谢。

    平面文件源

    D:\ss\a1.txt 

    a1.txt

    col1 col2 col3

    希望导入sql数据库

    table dbo.a1

    2012年7月23日 13:38

答案

  • 截取字符串的示例如下。用于脚本任务(Script Task),比如FileName变量的值是D:\ss\a1.txt,这段代码会把TableName变量的值置为a1。

    public void Main()

            {

                // TODO: Add your code here

                string Filename = Dts.Variables["FileName"].Value.ToString();

                int LastSlashPos = Filename.LastIndexOf("\\");

                int LastPointPos = Filename.LastIndexOf(".");

                //if (LastPointPos < LastSlashPos)

                //{

                //    error handle

                //}

                Dts.Variables["TableName"].Value = Filename.Substring(LastSlashPos + 1, LastPointPos - LastSlashPos - 1);

                Dts.TaskResult = (int)ScriptResults.Success;

            }

    要导入这个表,在OLE DB目标(OLE DB Destination)里面选择“表名变量或视图名变量-快速加载”


    想不想时已是想,不如不想都不想。

    2012年7月24日 6:26
    版主
  • 表名不能直接用变量。你要把整个sql语句放入一个变量。你再加一个变量叫做sql,

    然后在script task里面再加上

    Dts.Variables["SQL"].Value = "CREATE TABLE " + Dts.Variables["TableName"].Value + "(………………)";

    注意不要回车换行。


    想不想时已是想,不如不想都不想。

    2012年7月25日 5:59
    版主
  • 谢谢怡红公子指点,已经顺利完成。

    • 已标记为答案 ldfnewer 2012年7月26日 1:01
    2012年7月26日 1:01

全部回复

  • 如何实现参数替代的SQL,能否提供一个样本或者网址


    2012年7月23日 13:44
  • 无法根据用户变量的值,采用截取字符串等方法来确定目标表格名称”不是很明白这句话,你想利用T-SQL函数截取文件名来确定表名是吧?

    给我写信: QQ我:点击这里给我发消息

    2012年7月24日 6:15
  • 截取字符串的示例如下。用于脚本任务(Script Task),比如FileName变量的值是D:\ss\a1.txt,这段代码会把TableName变量的值置为a1。

    public void Main()

            {

                // TODO: Add your code here

                string Filename = Dts.Variables["FileName"].Value.ToString();

                int LastSlashPos = Filename.LastIndexOf("\\");

                int LastPointPos = Filename.LastIndexOf(".");

                //if (LastPointPos < LastSlashPos)

                //{

                //    error handle

                //}

                Dts.Variables["TableName"].Value = Filename.Substring(LastSlashPos + 1, LastPointPos - LastSlashPos - 1);

                Dts.TaskResult = (int)ScriptResults.Success;

            }

    要导入这个表,在OLE DB目标(OLE DB Destination)里面选择“表名变量或视图名变量-快速加载”


    想不想时已是想,不如不想都不想。

    2012年7月24日 6:26
    版主
  • C#代码?

    给我写信: QQ我:点击这里给我发消息

    2012年7月24日 7:19
  • 感谢各位的指导。

    我使用的是Microsoft Visual Basic 2010,SQL Server Data Tools

    目的是将文件夹中上千个TXT文件,以其文件名作为SQl数据库中的表名(不含路径)。

    文本文件是以字符串形式保存,所以要做数据格式转换。

    SSIS组件对于单个文件是很方便的,所以尝试用单个文件转换,然后将数据流等放在foreach循环。

    操作流程是:

    1、单个平面文件转换。(成功测试)(包含平面文件、10转换、OLE DB目标)

    2、将数据流放在FOREACH循环,修改平面连接管理器(conectionstring对应foreach中变量FileName)

    3、指定导入SQL的表名

    问题出在第三步。

    如果固定表名,缺少一项关键的信息。

    按照怡红公子的指点,我理解是将表名转换后,作为项目或者包的参数,自动会更新表名,然后会成功将各文件导入,但还是出现问题。

    估计是对某些操作理解不透产生的问题。

    系统提示另附
    恳请提供一个详细的操作步骤。将二个txt文本转换为SQL表。

    万分感谢!

    2012年7月24日 10:21
  • 感谢各位的指导。

    我使用的是Microsoft Visual Basic 2010,SQL Server Data Tools

    目的是将文件夹中上千个TXT文件,以其文件名作为SQl数据库中的表名(不含路径)。

    文本文件是以字符串形式保存,所以要做数据格式转换。

    SSIS组件对于单个文件是很方便的,所以尝试用单个文件转换,然后将数据流等放在foreach循环。

    操作流程是:

    1、单个平面文件转换。(成功测试)(包含平面文件、10转换、OLE DB目标)

    2、将数据流放在FOREACH循环,修改平面连接管理器(conectionstring对应foreach中变量FileName)

    3、指定导入SQL的表名

    问题出在第三步。

    如果固定表名,缺少一项关键的信息。

    按照怡红公子的指点,我理解是将表名转换后,作为项目或者包的参数,自动会更新表名,然后会成功将各文件导入,但还是出现问题。

    估计是对某些操作理解不透产生的问题。

    系统提示如下
    恳请提供一个详细的操作步骤。将二个txt文本转换为SQL表。

    万分感谢!

    2012年7月24日 10:21
  • 在 System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
       在 System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
       在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
       在 System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams)
       在 Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript()

    2012年7月24日 10:22
  • 用BIDS开发,我也希望大侠可以能够给出解决方案,最近使用sqlserver的BIDS按照书本进行数据的ETL,可惜对BI不熟悉没有经验

    给我写信: QQ我:点击这里给我发消息

    2012年7月24日 12:25
  • 那段代码是加到Script Task里面的,你要在DataFlow前面加一个Script Task,类型选C#


    想不想时已是想,不如不想都不想。

    2012年7月24日 15:44
    版主

  • 想不想时已是想,不如不想都不想。

    2012年7月24日 15:50
    版主

  • 想不想时已是想,不如不想都不想。

    2012年7月24日 15:51
    版主

  • 想不想时已是想,不如不想都不想。

    2012年7月24日 15:51
    版主
  • 在执行SQL任务中,如何使用之前的变量?

    怎么设置?

    本例中,我想先建一张表,表名就是TableName

    SQLSourceType是选直接输入?还是变量

    表达式生成器中,SQL语句分析怎么弄能通过?

    将TableName变量从上面拖下,提交一直在提示

    2012年7月25日 4:00
  • 表名不能直接用变量。你要把整个sql语句放入一个变量。你再加一个变量叫做sql,

    然后在script task里面再加上

    Dts.Variables["SQL"].Value = "CREATE TABLE " + Dts.Variables["TableName"].Value + "(………………)";

    注意不要回车换行。


    想不想时已是想,不如不想都不想。

    2012年7月25日 5:59
    版主
  • 可惜啊,BIDS2005没有C#语言


    给我写信: QQ我:点击这里给我发消息

    2012年7月25日 7:54
  • 谢谢怡红公子指点,已经顺利完成。

    • 已标记为答案 ldfnewer 2012年7月26日 1:01
    2012年7月26日 1:01