我有一个包含以下内容的安装脚本:
IF NOT EXISTS(
SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_CATALOG = 'mydatabasename'
AND TABLE_SCHEMA = 'dbo'
AND TABLE_NAME = 'sometablename'
AND TABLE_TYPE = 'BASE TABLE'
)
CREATE TABLE dbo.sometablename ...
问题在于
sometablename
安装程序在执行脚本之前执行USE mydatabasename
;并且安装程序允许为此选择变量数据库名称。但是,我无法在脚本中使用该变量,因为SQL脚本中的每个替换都已在安装程序的构建时完成。
那么,如何检查已使用的数据库是否已包含表sometablename
?
答案 0 :(得分:1)
只需从查询中删除TABLE_CATALOG
即可。 INFORMATION_SCHEMA.TABLES
视图中的所有表都属于当前数据库。
答案 1 :(得分:0)
您可以选择正在使用的实际数据库的名称,并将其替换为执行语句。
declare @dbname varchar(50) -- Adjust to your longer database name length.
set @dbname = db_name()
if not exists (
select 1
from information_schema.tables
where table_catalog = @dbname
and table_schema = 'dbo'
and table_name = 'someTableName'
and table_type = 'base table'
) begin
execute (
'create table ' + @dbname + '.dbo.someTableName (
someFieldName someDataType
...
)'
)
end
否则,它始终使用当前数据库,以便它通过use
语句考虑当前使用的数据库。
答案 2 :(得分:0)
您仍然可以使用SQL Script replacement support from Advanced Installer。
确实,替换是在构建时完成的,但引用的属性是在安装时解决的,因此您可以使用用户选择的数据库名称。只需正确设置“替换为”字段: [SELECTED_DB]
脚本中的替换是在构建时完成的,因为您无法直接编写脚本中格式化的属性(语法限制)。