- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我的数据库中有将近 120 个表。最近为了更新一些业务逻辑和控制流量用户,我需要通过添加 5 列来更新每个表。这些列如下所示
- IsActive
- IsBlocked
- IsVerified
- CreatedByDate
- LastModifiedByDate
我已经为单个表尝试过这种方式,比如 Users
表
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.columns WHERE table_name = 'Users' AND column_name = 'IsActive')
ALTER TABLE dbo.Users ADD
IsActive bit NULL DEFAULT ((1))
GO
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.columns WHERE table_name = 'Users' AND column_name = 'IsBlocked')
ALTER TABLE dbo.Users ADD
IsBlocked bit NULL DEFAULT ((1))
GO
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.columns WHERE table_name = 'Users' AND column_name = 'IsVerified')
ALTER TABLE dbo.Users ADD
IsVerified bit NULL DEFAULT ((0))
GO
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.columns WHERE table_name = 'Users' AND column_name = 'CreatedByDate')
ALTER TABLE dbo.Users ADD
CreatedByDate datetime NULL DEFAULT GETDATE()
GO
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.columns WHERE table_name = 'Users' AND column_name = 'LastModifiedByDate')
ALTER TABLE dbo.Users ADD
LastModifiedByDate datetime NULL DEFAULT GETDATE()
GO
但是我真的很难通过替换表名手动申请所有表,因为它包含大约 120 个表。因此,我正在寻找一种最好的方法来最大程度地减少这个冗长的过程或通过最聪明的方式来完成。当我从我的系统表 sys.tables
中获取表列表时,为什么我不通过循环来完成它以最大限度地减少我的工作。谁能帮我解决这个有问题的问题?
最佳答案
你已经完成了一半。现在您只需要动态创建 ALTER
语句,以便从数据库中的表列表中获取表名:
我会这样做:
declare @sql nvarchar(1000)
, @tableName nvarchar(128) = 'category'
, @colIsIsActive nvarchar(10) = 'IsActive'
, @colIsIsBlocked nvarchar(20) = 'IsBlocked'
, @colIsIsVerified nvarchar(20) = 'IsVerified'
, @colCreatedByDate nvarchar(20) = 'CreatedByDate'
, @colIsLastModifiedByDate nvarchar(20) = 'LastModifiedByDate'
select @sql = N' IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.columns WHERE table_name = ''' + @tableName + ''''
+ ' AND column_name = ''' + @colIsIsActive + ''')'
+ ' ALTER TABLE ' + QUOTENAME(@tableName)
+ ' ADD ' + @colIsIsActive
+ ' BIT NULL DEFAULT ((1))'
select @sql
--exec(sql)
这需要在游标内写入 5 次,您将表的名称读入 @tableName
。您需要为其他 4 列编写完全相同的内容。在这种情况下游标不是问题,您只需运行一次它就会遍历 120 个表,这不是问题。
我会声明 5 个不同的 @sql
变量,以免最后生成太长的字符串。
下面是我正在谈论的整个解决方案:'
declare @sqlAddIsActive nvarchar(1000)
, @sqlAddIsBlocked nvarchar(1000)
, @sqlAddIsVerified nvarchar(1000)
, @sqlAddCreatedByDate nvarchar(1000)
, @sqlAddLastModifiedByDate nvarchar(1000)
, @tableName nvarchar(128)
, @colIsIsActive nvarchar(10) = 'IsActive'
, @colIsIsBlocked nvarchar(20) = 'IsBlocked'
, @colIsIsVerified nvarchar(20) = 'IsVerified'
, @colCreatedByDate nvarchar(20) = 'CreatedByDate'
, @colIsLastModifiedByDate nvarchar(20) = 'LastModifiedByDate'
declare tables_cursor cursor for
select table_name from information_schema.tables where table_type='base table'
open tables_cursor
fetch next from tables_cursor --start the cursor
into @tableName
while @@fetch_status = 0 --while there is a loaded record, keep processing
begin
select @sqlAddIsActive = N' IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.columns WHERE table_name = ''' + @tableName + ''''
+ ' AND column_name = ''' + @colIsIsActive + ''')'
+ ' ALTER TABLE ' + QUOTENAME(@tableName)
+ ' ADD ' + @colIsIsActive
+ ' BIT NULL DEFAULT ((1))'
select @sqlAddIsBlocked = N' IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.columns WHERE table_name = ''' + @tableName + ''''
+ ' AND column_name = ''' + @colIsIsBlocked + ''')'
+ ' ALTER TABLE ' + QUOTENAME(@tableName)
+ ' ADD ' + @colIsIsBlocked
+ ' BIT NULL DEFAULT ((1))'
select @sqlAddIsVerified = N' IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.columns WHERE table_name = ''' + @tableName + ''''
+ ' AND column_name = ''' + @colIsIsVerified + ''')'
+ ' ALTER TABLE ' + QUOTENAME(@tableName)
+ ' ADD ' + @colIsIsVerified
+ ' BIT NULL DEFAULT ((1))'
select @sqlAddCreatedByDate = N' IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.columns WHERE table_name = ''' + @tableName + ''''
+ ' AND column_name = ''' + @colCreatedByDate + ''')'
+ ' ALTER TABLE ' + QUOTENAME(@tableName)
+ ' ADD ' + @colCreatedByDate
+ ' BIT NULL DEFAULT ((1))'
select @colIsLastModifiedByDate = N' IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.columns WHERE table_name = ''' + @tableName + ''''
+ ' AND column_name = ''' + @colIsLastModifiedByDate + ''')'
+ ' ALTER TABLE ' + QUOTENAME(@tableName)
+ ' ADD ' + @colIsLastModifiedByDate
+ ' BIT NULL DEFAULT ((1))'
-- to see what is generated:
select @sqlAddIsActive
select @sqlAddIsBlocked
select @sqlAddIsVerified
select @sqlAddCreatedByDate
select @sqlAddLastModifiedByDate
-- to execute, uncomment this after testing the select's
--exec(@sqlAddIsActive)
--exec(@sqlAddIsBlocked)
--exec(@sqlAddIsVerified)
--exec(@sqlAddCreatedByDate)
--exec(@sqlAddLastModifiedByDate)
fetch next from tables_cursor into @tableName --fetch next record
end
close tables_cursor --close and deallocate
deallocate tables_cursor
EDIT:
请注意:不要在生产环境中运行。 ALTER TABLE
是一个 DDL
操作,根据表的大小,可能需要一些时间。这需要在开发/测试 环境中进行测试,只有在采取适当措施后才能应用于生产!
关于sql-server - 如何在 MS SQL 服务器的数据库中的每个表中创建一组相同的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44675848/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!