问题标签 [sp-msforeachtable]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1643 浏览

sql-server - 如何从数据库中删除所有表中的数据,除了少数表

我的数据库中有 50 多个表,我想删除 48 个表中的所有数据。

我尝试使用

但它会删除所有表中的所有数据。

有人可以建议我需要进行哪些更改才能从查询中除 TABLE1、TABLE2 等之外的所有表中删除数据:

我正在使用 SQL Server 2008R2。

0 投票
0 回答
143 浏览

sql-server - 重新播种数据库中的所有表时,身份种子在 0 和 1 之间混合

**更新(2017 年 5 月 18 日)**

我发现问题并没有我想象的那么大。这仅在部署模式后发生,并且在初始阶段迁移错误。唯一需要部署模式的情况是新数据库是否有新的或修改。然后,一旦迁移工具开始,它必须成功填充整个数据库(大约需要 20 分钟),因此错误数 * 完成所需的时间 = 修复所有错误的总时间,这可能需要几个小时。但是,如果这种情况发生,那就有点令人不安了。如果迁移成功,并且没有对架构进行任何修改,那么下面的场景就不会麻烦了。这些修改不会经常发生,可能每月一次或两次。不过,我仍然对其他类型的解决方案感兴趣。

**原始帖子(2017 年 5 月 17 日)**

我已经查看了以下相关的 Stack Overflow 问题,但没有人回答我正在经历的问题。

为什么在 SQL Server 2008 R2 中设置当前标识值对我不起作用?

无法截断表,因为它被 FOREIGN KEY 约束引用?

背景故事

我的任务是迁移数据库,涉及表的重组,确保它具有数据完整性,并简化架构。本次迁移由c#应用程序执行,调用存储过程,添加业务逻辑等。每天早上5点,有一个任务调度器清空除审计表之外的所有数据,并取回所有刷新的数据(如果原数据已更新)。迁移工具是幂等的,这样可以删除和重新创建数据库,运行迁移工具后一切恢复正常(有刷新数据)。此外,迁移工具首先通过引用表导入相关数据,以确保不会发生违反约束的情况,并且它还会选择那些索引 ID,而不是任何旧的遗留 ID。每个表也有 IDENTITY (1,1)

为了确保刷新数据库,我必须执行 DELETE FROM 操作。截断表不起作用,因为会违反外键约束。所以我这样做的方式是关闭约束,从数据中删除,重新打开约束,然后重新设置值。

所以当我的程序运行时,它会执行以下几行:

但是,如果数据库实例是全新安装的,并且我运行迁移工具并出现错误,则会出现问题,因为某些表不会被填充。由于少数表插入了记录,而其他表没有插入记录;这意味着,如果我在迁移工具中再次运行上述代码,插入记录的表的下一个种子值将是 ID=1,而未触及表的种子值将为空(并且第一个插入将从 ID=0 开始)。这是因为这会覆盖 IDENTITY (1,1)。如果我要在没有插入记录的表上运行 DBCC CHECKIDENT,例如

您会得到以下信息:

检查身份信息:当前身份值“NULL”,当前列值“NULL”。

无论您做什么,都不能将身份值“NULL”重新设置为任何其他数字。

这成为一个严重的问题,因为每次迁移工具运行时,我都会遇到外键约束违规,因为引用的表中不存在某些索引。这也有一个多米诺骨牌效应,如果一个表的索引不正确(ID = 0),所有引用该表的表都将违反约束 - 跳过导入,并且这些表上的索引将是 ID = 0 以及下一个我们运行迁移工具的时间。

HACK 解决方案:

我希望所有表都从 ID=1 开始,而不是 0。所以到目前为止,确保它运行的唯一可能方法是从干净的状态中清除数据库(删除并重新创建),评论去掉上面的四个命令代码,运行迁移工具,希望填充所有表成功,回到代码,取消注释四个命令代码,将工具部署到任务调度器中。

问题

有什么方法DBCC CHECKIDENT可以返回我的 c# 应用程序可以识别的值,或者可能找到/忽略所有尚未插入的表,以便我只能重新设置已插入的表?或者我应该尝试跟踪运行了哪些表,并查看迁移工具是否可以在下次运行时忽略这些表?如果是这种情况,那么最好的方法是什么?

0 投票
1 回答
1174 浏览

sql-server - 在查询中打印表名

我想对所有表执行查询,但我需要检查结果。如果我做:

结果如下所示:

检查身份信息:当前身份值'35',当前列值'35'。
DBCC 执行完成。如果 DBCC 打印错误消息,请联系您的系统管理员。
消息 7997,级别 16,状态 1,第 3 行
“DocumentsJobPositions”不包含标识列。

等等。有时没关系,有时我需要进行一些修复,所以我需要每个查询的每个表的名称!

我怎样才能做到这一点?

0 投票
0 回答
44 浏览

sql-server - MSforeachtable 不执行触发器

我有以下要在数据库中的每个表上执行的触发器:

我收到每个表的以下错误:

当我在一个表上尝试没有 MSforeachtable 过程的触发器时,它可以工作。有人知道上面的查询有什么问题吗?

谢谢

编辑:

我什至试图将这两个语句分成两个命令并DROP TRIGGER省略。如果它不存在就创建它。现在我发现关键字附近的语法不正确TRIGGER

0 投票
0 回答
189 浏览

sql-server - SQL Server - 使用 EXEC sp_msforeachtable 时更改表 FOREIGN KEY 冲突

我正在尝试使用 Microsoft SQL Server 将一些数据从一个数据库迁移到另一个数据库。两个数据库都有一个由外键引用的“属性/位置”类型的表。

不幸的是,即使两个表中引用的实体相同,主键也不同。因此,为了迁移数据,我试图暂时禁用外键约束,适当地插入和更新数据,然后重新启用约束。

但是,我收到以下消息:

ALTER TABLE 语句与 FOREIGN KEY 约束“FK__TwelveCri__Store__114A936A”冲突。冲突发生在数据库“API”、表“dbo.Properties”、列“ID”中。

虽然,我理解抛出错误的一般原因(它没有StoreID在表中的列Reports和 中的ID列之间找到匹配Properties),但我不明白为什么在这种特定情况下会这样做。

接近结尾的SELECT语句不返回任何结果,如果关系得到正确更新,这是我所期望的。但是,我仍然收到上述错误消息,大概来自EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL";声明。

任何意见,将不胜感激。

0 投票
1 回答
236 浏览

sql-server - SQL Server sp_MSforeachtable 脚本错误

采取以下脚本:

当我在 SSMS 中执行上述脚本时,出现以下错误:

消息 544,级别 16,状态 1,第 36 行当 IDENTITY_INSERT 设置为 OFF 时,无法在表“_adminServices”中插入标识列的显式值。

谁能告诉我为什么?

编辑:我的目标如下:我有多个表和多个插入。对于插入,我有脚本。由于我不想为每个表都编写 SET IDENTITY_INSERT ON 和 OFF 因为我只是对文件进行 INSERT INTO 查询,所以我想要一种方法来执行以下操作:

  1. 删除数据库中的所有表

  2. 创建所有表(我有这方面的 SQL)

  3. 将所有必需的身份设置为 ON

  4. 运行插入(我有这方面的 SQL)

  5. 将所有必需的身份设置为 OFF

0 投票
2 回答
142 浏览

sql - 选择字段,如果它存在于所有数据库表上

我有一个包含 100 多个表的 SQL Server 数据库。许多(但不是全部)都有一个名为的列ins_date,用于保存每条记录插入数据库的日期。

我想获得数据库中每个表的最后(最大)插入日期。我做了一些修补sp_MSforeachtable,似乎足以遍历所有表。

我面临的问题:当我的查询遇到没有该ins_date列的表时,它们将返回错误。我可以使用什么以及sp_MSforeachtable仅从具有 的表中获取信息ins_date,而忽略其他表或将其返回为 NULL?

0 投票
1 回答
55 浏览

sql - 截断数据库中的所有表

我已执行以下脚本来删除/截断特定数据库中的所有表:

上面的脚本会截断所有数据库中的所有表还是只截断我正在运行它的数据库?

0 投票
1 回答
2578 浏览

sql-server - 如何在一个查询中清除所有系统版本表?

我有一个查询,它允许我删除所有行并重置所有表的所有缩进列,而不会破坏任何外键引用。此查询适用于普通 SQL Server 表:

问题是,现在我使用的是系统版本的时态表,以前的查询不再起作用。我的版本化表都已命名tbl_Foo,每个历史表都采用tbl_Foo_history.

我尝试使用这样的东西:

但它给出了错误:

因为sp_MSForEachTable当试图从历史表中删除版本控制时,显然会变得非常混乱。

如果不为每个表单独指定查询,我应该如何做到这一点?