我必须设计一个 SSIS 包,只要可用,就加载flatfile 从路径到数据库表。 如何在生产中实施它请建议。
我使用SQL Agent来执行它。是否只能使用sql或C#, WITHOUT 任何三分之一 党的工具。 ?
由于
答案 0 :(得分:0)
我在下面创建了一个教程。在部署包之后,您可以在SSMS中创建一个作业,该作业将在指定的时间运行以执行您的包。
要完成此目标,需要执行以下任务。 1. Foreach循环容器:迭代用户配置的文件目录。 2. 表达式任务:如果文件存在,则更新变量。
<强>步骤强> 1.首先转到解决方案资源管理器,双击 Project.params 并创建一个类型为string的参数 FolderPath ,将值设置为E:\ DataDir \ SourceFiles。 2.创建用户变量 FileNameFromFolder (String), FileToSearch (String)分配要检查的值并创建变量 IsFound (布尔值) 。 3.从容器部分下的SSIS工具箱中拖放 Foreach循环容器。 4.双击Foreach循环编辑器左侧的 Foreach循环容器,单击集合。在右侧将Enumerator设置为 Foreach文件枚举器,现在为表达式单击将打开属性表达式编辑器的三个点。选择Directory作为属性,对于表达式选择 @ [$ Project :: FolderPath] 。单击确定。 5.现在在Foreach循环编辑器中,为文件集 * .txt 的值,对于检索文件名的值,选择仅名称,通常我们选择完全合格,因为它返回具有完整路径的文件名。如果文件夹中可以有多个文件夹,请检查 Traverse子文件夹。 6.在左侧选择变量映射,在右侧选择 User :: FileNameFromFolder ,它将自动将索引设为0.文件名来自 FolderPath < / em>将逐个分配给 FileNameFromFolder 变量。单击确定。 7.从 Common 部分下的SSIS工具箱中将表达式任务拖放到 Foreach循环容器中。 8.双击 Expression Task ,在Expression Builder中编写以下代码。单击“确定”。
// Runs a shell command using given command string and returns the output.
char* runShellReadCmd(char* command) {
FILE *fp;
int outputCurrentSize = 0, outputArrSize = READ_INITIAL_SIZE, elementsRead = 0;
char readChunk[READ_CHUNK], *tmpOutputStrArr = NULL, *data = NULL;
printf("%s", command);
fflush(stdout);
fp = popen(command, "r");
data = (char*)calloc(READ_INITIAL_SIZE, sizeof(char));
// while (fgets(readChunk, READ_CHUNK, fp) != NULL)
while (elementsRead = fread(readChunk, sizeof(char), READ_CHUNK, fp) != READ_CHUNK)
{
// If string size equals to the array size, need to expand the array.
if (outputCurrentSize >= outputArrSize) {
outputArrSize *= 2;
// Re allocate array, save it in a temporary array.
tmpOutputStrArr = realloc(data, outputArrSize * sizeof(char));
// If re-allocationg failed, stop and return NULL to indicate that a problem has occured.
if (!tmpOutputStrArr) {
free(tmpOutputStrArr);
free(data);
return NULL;
}
data = tmpOutputStrArr;
}
// Concatenate the recently read 100 chars to the data arr.
strcat(data, readChunk);
// Save current string length.
outputCurrentSize += READ_CHUNK;
}
pclose(fp);
return data;
}
// Returns the number of times the given substring appears in the given string.
int getNumOfMatches(char* string, char* substring) {
int count = 0;
char* temp = string;
while ((temp = strstr(temp, substring))) {
count++;
temp++;
}
return count;
}
// Returns the first wlan device name thats available in the system.
char* getWlanDeviceName() {
int size = 0, i;
char* device, *tmpPointer, *deviceNameStartPointer;
char* str = runShellReadCmd("/sbin/ifconfig");
deviceNameStartPointer = strstr(str, WIFI_DEVICE_PREFIX);
tmpPointer = deviceNameStartPointer;
while (*tmpPointer != ' ') {
size++;
tmpPointer++;
}
device = (char*)calloc(size, sizeof(char));
tmpPointer = deviceNameStartPointer;
for(i = 0; i < size; i++) {
device[i] = *tmpPointer;
tmpPointer++;
}
free(str);
return device;
}
9.上面的代码将我们要检查的文件名与文件夹中的文件名进行比较,如果两者匹配,则将 IsFound 设置为True(文件存在)。 10.现在IsFound的值可以根据需要与优先约束一起使用。