SSIS - 检查数据库和表是否存在,如果不存在 - 运行 sql 创建

SSIS - check if database and tables exist, if not - run sql to create

我计划使用 SSIS 包将数据导入 Azure SQL 数据库。我知道我可以使用 OLEDB 源和目标来做到这一点,但我还想检查数据库和表是否存在,如果不存在,则创建它们。我计划使用 Execute SQL 任务来创建数据库和表,但我如何首先检查它们是否已经存在?

所以如果数据库和表存在,我将运行数据流任务传输数据,但如果它们不存在-运行执行SQL任务创建数据库和表,然后 运行 数据流任务。

我怎样才能做到这一点?

SSDT(数据库工具,而非 SSDT-BI 产品套件)使用声明性模型来管理和部署数据库模式。可以获得SSDT here.

创建新的 SQL 服务器数据库项目后,您可以导入现有的数据库架构。在数据库属性中,您将目标数据库定义为 Azure。当您构建项目时,它会创建一个 dacpac 文件作为输出。该文件是包含数据库定义的存档。

SSDT自带一个实用工具sqlpackage.exe,你可以了解一下here。然后,您可以传入 dacpac 文件和目标服务器,并让实用程序 "publish" 成为数据库。如果数据库和模式匹配,它什么都不做。如果它不存在,将创建所有对象。如果模式与预期不同,它将根据它在项目中的定义更新模式。

SSDT 的好处远不止于此,但对于您的情况,它将简化流程并使其更易于维护。

顺便说一句,如果数据库不存在,您可能需要对包其余部分的连接管理器和任务进行延迟验证,以免验证失败。或者更好的是,创建一个主包,该主包首先执行 sqlpackage 进程任务,然后将您的加载包作为子包调用。

我对 Azure 或 SSIS 不是很熟悉,但在 SQL 服务器中,您可以检查是否存在这样的对象:

IF OBJECT_ID('dbo.UserTable', 'U') 为空 -- 不存在。

我希望这对您有所帮助。

  1. 为服务器和主数据库创建 OLE DB 连接管理器。在接下来的两个步骤中应用此连接管理器。
  2. 在容器中创建两个 SQL 任务。第一个 SQL 任务将检查数据库是否存在。您可以将数据库名称作为变量传递给它,并在 SQL 示例中应用它,如下所示。这 ”?”是数据库名称变量。

    如果不存在(SELECT * 来自 sys.sysdatabases where name=?) -- 创建数据库

  3. 然后对于第二个 SQL 任务应用类似下面的内容,其中数据库和 table 名称作为变量传递。但是,与之前的 SQL 不同的是,您可以应用表达式来定义 SQL.

    "IF OBJECT_ID(N'" + <@DatabaseName> + "dbo." + <@tablename> + ", N'U') IS NULL 创建 TABLE " + <@DatabaseName> + "dbo." + <@tablename> + " ( Field1 VARCHAR(20) 不为空 ,Field2 TINYINT 不为空 );"