我计划使用SSIS包将数据导入Azure SQL数据库。我知道我可以用OLEDB Source和Destination做到这一点,但我也想检查数据库和表是否存在,如果不存在 - 创建它们。我打算使用执行SQL任务来创建数据库和表,但我该如何检查它们是否已经存在?
因此,如果存在数据库和表,我将运行数据流任务来传输数据,但如果它们不存在 - 运行执行SQL任务来创建数据库和表,然后运行数据流任务。
我该如何实现?
答案 0 :(得分:0)
SSDT(数据库工具,而不是SSDT-BI产品套件)使用声明性模型来管理和部署数据库模式。您可以获得SSDT here。
创建新的SQL Server数据库项目后,可以导入现有的数据库架构。在数据库属性中,您将目标数据库定义为Azure。构建项目时,它会创建一个dacpac文件作为输出。此文件是包含数据库定义的存档。
SSDT附带了一个名为sqlpackage.exe的实用程序,您可以从中了解here。然后,您可以传入dacpac文件和目标服务器,并使用实用程序"发布"数据库。如果数据库和模式匹配,则不会执行任何操作。如果不存在,则将创建所有对象。如果架构与预期不同,它将根据在项目中的定义方式更新架构。
SSDT具有比这更多的好处,但对于您的情况,它将简化流程并使其更易于维护。
顺便说一句,如果数据库不存在,您可能需要在连接管理器和任务的其余部分中对延迟验证进行延迟验证,以便验证失败。或者更好的是,创建一个主包,首先执行sqlpackage进程任务,然后将您的加载包作为子包调用。
答案 1 :(得分:0)
我对Azure或SSIS不太熟悉,但在SQL Server中,您可以检查对象是否存在,如下所示:
如果OBJECT_ID(' dbo.UserTable',' U')为空 - 不存在。
我希望这会有所帮助。
答案 2 :(得分:0)
在容器中创建两个SQL任务。第一个SQL任务将检查数据库是否存在。您可以将数据库名称作为变量传递给它,并将其应用于SQL示例中,如下所示。 "?"是数据库名称变量。
IF NOT EXISTS(SELECT * FROM sys.sysdatabases where name =?) - 创建数据库
然后,对于第二个SQL任务,应用类似下面的内容,其中数据库和表名称作为变量传递。但是,与以前的SQL不同,您可以应用表达式来定义SQL。
"如果OBJECT_ID(N'" +< @ DatabaseName> +" dbo。" +< @ tablename> +",N&#39 ; U')IS为空 创建表" +< @ DatabaseName> +" dbo。" +< @ tablename> +" ( Field1 VARCHAR(20)NOT NULL ,Field2 TINYINT NOT NULL );"