题
作为构建过程的一部分,我们在将代码部署到4个不同的环境时运行数据库更新脚本。此外,由于在我们将发布版本投入生产之前会添加相同的查询,因此 能够在给定数据库上多次运行。像这样:
IF NOT EXISTS (SELECT * FROM sys.tables WHERE object_id = OBJECT_ID(N'[Table]'))
BEGIN
CREATE TABLE [Table]
(...)
END
目前,我在部署/构建脚本中有一个create schema语句。我在哪里查询模式的存在?
解决方案
您是否正在寻找 sys.schemas ?
IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'jim')
BEGIN
EXEC('CREATE SCHEMA jim')
END
请注意CREATE SCHEMA
必须以自己的批次运行(根据以下答案)
其他提示
@bdukes确定模式是否存在是正确的,但上述语句在SQL Server 2005中不起作用。CREATE SCHEMA <name>
需要在自己的批处理中运行。解决方法是在exec中执行CREATE SCHEMA
语句。
以下是我在构建脚本中使用的内容:
IF NOT EXISTS (SELECT 1 FROM sys.schemas WHERE name = '<name>')
BEGIN
-- The schema must be run in its own batch!
EXEC( 'CREATE SCHEMA <name>' );
END
只是额外 <!>“防御<!>”,以下版本会生成类型转换错误,以说明<!> gt;的可能性(但不太可能) 1匹配Schema
类似于验证代码通常故意抛出异常的原因,因为我认为它是好的,我相信它是<!>“最佳实践”<!>考虑到所有可能的返回结果,但不太可能,即使它只是产生致命异常,因为停止处理的已知效果通常优于未捕获错误的未知级联效应。因为它不太可能,我认为值得单独Count
检查+ Throw
或Try
- Catch
- <=>的麻烦,以产生更加用户友好的致命错误,但仍然是致命的错误仍然。
SS 2005-:
declare @HasSchemaX bit
set @HasSchemaX = case (select count(1) from sys.schemas where lower(name) = lower('SchemaX')) when 1 then 1 when 0 then 0 else 'ERROR' end
SS 2008+:
declare @HasSchemaX bit = case (select count(1) from sys.schemas where lower(name) = lower('SchemaX')) when 1 then 1 when 0 then 0 else 'ERROR' end
然后:
if @HasSchemaX = 1
begin
...
end -- if @HasSchemaX = 1
这是旧的所以我觉得有必要添加:对于SQL SERVER 2008+这些都可以工作(对于选择部分),然后使用EXECUTE('CREATE SCHEMA <name>')
在负面结果上实际创建它。
DECLARE @schemaName sysname = 'myfunschema';
-- shortest
If EXISTS (SELECT 1 WHERE SCHEMA_ID(@schemaName) IS NOT NULL)
PRINT 'YEA'
ELSE
PRINT 'NOPE'
SELECT DB_NAME() AS dbname WHERE SCHEMA_ID(@schemaName) IS NOT NULL -- nothing returned if not there
IF NOT EXISTS ( SELECT top 1 *
FROM sys.schemas
WHERE name = @schemaName )
PRINT 'WOOPS MISSING'
ELSE
PRINT 'Has Schema'
SELECT SCHEMA_NAME(SCHEMA_ID(@schemaName)) AS SchemaName1 -- null if not there otherwise schema name returned
SELECT SCHEMA_ID(@schemaName) AS SchemaID1-- null if not there otherwise schema id returned
IF EXISTS (
SELECT sd.SchemaExists
FROM (
SELECT
CASE
WHEN SCHEMA_ID(@schemaName) IS NULL THEN 0
WHEN SCHEMA_ID(@schemaName) IS NOT NULL THEN 1
ELSE 0
END AS SchemaExists
) AS sd
WHERE sd.SchemaExists = 1
)
BEGIN
SELECT 'Got it';
END
ELSE
BEGIN
SELECT 'Schema Missing';
END
不隶属于 StackOverflow