日度归档:2019年4月7日

mssql sqlserver sql脚本中替代not in关键字的方法分享


摘要:
下文通过举例的方式分享,sql脚本中替代not in关键字的写法,如下所示:
实验环境:sql server 2008 R2


常常在编写返回一张表中指定列不在另一张表的写法中时,我们使用最简便的方法如下所示:

 select * from tableNameA 
   where [列名] not in 
   ( 
     select [列名] from tableNameB
      where ...
   )

大家常说这种写法效率低下(未做实验证明),下面讲述一种改写not in 的写法,如下所示:
例:
表 maomaoA
拥有keyId和info两列
表 maomaoB
拥有keyId 和 infoB两列

当我们不想使用 not in 关键字时,我们可以采用连接的方式操作,如下
select a.keyId,a.info from maomaoA a
where exists (
select * from maomaoB b where b.keyId = a.keyId
)

mssql sqlserver 向标识列中插入数据的方法分享


下文讲述指定标识列中的数据的方法分享,如下所示:
实验环境:sql server 2008 R2



一、不能向表 ‘xxxxxxxx’ 中的标识列插入显式值。”

在向标识列的表中插入数据时,常常会出现如下错误提示信息:
“当 IDENTITY_INSERT 设置为 OFF 时,不能向表 ‘xxxxxxxx’ 中的标识列插入显式值。”

     
CREATE TABLE [maomao365] (keyId int IDENTITY PRIMARY KEY, info nvarchar(30))
 
---向标识列中插入数据:
 
INSERT INTO [maomao365]  (keyId, info) VALUES(88, 'sql blog')
 
-----错误提示信息:“当 IDENTITY_INSERT 设置为 OFF 时,不能向表 'products' 中的标识列插入显式值。”

---修改标识列属性
 SET IDENTITY_INSERT [maomao365] ON 

   INSERT INTO [maomao365]  (keyId, info) VALUES(88, 'sql blog')
    ---数据插入成功

mssql sqlserver 使用sql脚本清空数据库中所有表数据的方法分享


摘要:
下文讲述使用sql脚本清空指定数据库中表数据的方法分享,如下所示:



表数据清空注意事项:
在清空表数据前,关闭表中的主外键约束
需注意主子表之间的约束

实现思路:
实现 sp_MSForEachTable 遍历生成删除数据表的数据脚本。
在生成删除脚本时,我们需要主子表(存在外键约束的表),我们需先删除子表,然后在删除主表,如果不按照此模式删除数据时,删除脚本会执行失败,为避免删除失败,我们可以采用以下两种方法处理:
1.按照先后顺序,依次对子表执行删除操作,然后对主表执行删除操作。
2.禁用所有约束,删除所有表数据,再启用约束。

删除表数据,脚本举例:

    CREATE PROCEDURE sp_DeleteAllTableData
     AS 
     
   EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
   EXEC sp_MSForEachTable 'ALTER TABLE ? DISABLE TRIGGER ALL'
   EXEC sp_MSForEachTable 'DELETE FROM ?'
   EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
   EXEC sp_MSForEachTable 'ALTER TABLE ? ENABLE TRIGGER ALL'
   EXEC sp_MSFOREACHTABLE 'SELECT * FROM ?'
  GO   
   

应用场景:
在一些不规范的系统开发中,我们常常需要在开发数据库上制作出一个空库,发布至生产环境使用。