楼主: Cherish_j_wang

[精华] MSSQL DBA 精华总结[处理对象名称中特殊字符]

[复制链接]
论坛徽章:
14
迷宫蛋
日期:2012-03-13 09:50:292014年新春福章
日期:2014-02-18 16:44:08优秀写手
日期:2013-12-18 09:29:15迷宫蛋
日期:2012-06-13 15:28:34咸鸭蛋
日期:2012-06-11 16:11:11灰彻蛋
日期:2012-05-31 10:18:54双黄蛋
日期:2012-05-28 17:45:17茶鸡蛋
日期:2012-05-28 17:27:32蜘蛛蛋
日期:2012-05-28 16:54:09迷宫蛋
日期:2012-05-17 19:00:48
51#
 楼主| 发表于 2012-3-13 21:29 | 只看该作者
今天分享至此结束,希望大家多多提意见

使用道具 举报

回复
论坛徽章:
26
ITPUB伯乐
日期:2012-05-22 15:05:35喜羊羊
日期:2015-05-14 12:15:30美羊羊
日期:2015-07-02 22:22:59秀才
日期:2015-08-24 09:51:48天枰座
日期:2015-11-05 16:53:35双鱼座
日期:2015-12-05 19:22:56巨蟹座
日期:2015-12-20 18:46:10摩羯座
日期:2016-05-19 09:54:17ITPUB15周年纪念
日期:2016-10-13 13:15:34秀才
日期:2017-02-22 15:16:26
52#
发表于 2012-3-14 17:27 | 只看该作者
Cherish_j_wang 发表于 2012-3-13 21:29
今天分享至此结束,希望大家多多提意见

加油 这周末结束再给你发个红包

使用道具 举报

回复
论坛徽章:
14
迷宫蛋
日期:2012-03-13 09:50:292014年新春福章
日期:2014-02-18 16:44:08优秀写手
日期:2013-12-18 09:29:15迷宫蛋
日期:2012-06-13 15:28:34咸鸭蛋
日期:2012-06-11 16:11:11灰彻蛋
日期:2012-05-31 10:18:54双黄蛋
日期:2012-05-28 17:45:17茶鸡蛋
日期:2012-05-28 17:27:32蜘蛛蛋
日期:2012-05-28 16:54:09迷宫蛋
日期:2012-05-17 19:00:48
53#
 楼主| 发表于 2012-3-14 20:08 | 只看该作者
hwtong 发表于 2012-3-14 17:27
加油 这周末结束再给你发个红包

发啥子红包嘛~~

使用道具 举报

回复
论坛徽章:
14
迷宫蛋
日期:2012-03-13 09:50:292014年新春福章
日期:2014-02-18 16:44:08优秀写手
日期:2013-12-18 09:29:15迷宫蛋
日期:2012-06-13 15:28:34咸鸭蛋
日期:2012-06-11 16:11:11灰彻蛋
日期:2012-05-31 10:18:54双黄蛋
日期:2012-05-28 17:45:17茶鸡蛋
日期:2012-05-28 17:27:32蜘蛛蛋
日期:2012-05-28 16:54:09迷宫蛋
日期:2012-05-17 19:00:48
54#
 楼主| 发表于 2012-3-14 21:09 | 只看该作者
本帖最后由 Cherish_j_wang 于 2012-3-14 21:17 编辑

MSSQL DBA 精华总结
之利用tablediff生成Insert语句
背景
MSSQL DBA有时候需要将某个表的数据来生成Insert语句。在MSSQL SSMS中没有提供这个直接生成INSERT脚本的方法(当然我们可以使用SMO来自己写),本文是使用Replication修复工具tablediff来完成这个工作。
PS:其实论坛中也有人问到这个问题,本次就在这里将其解决吧。帖子地址如下:

方法
Step1.设置环境变量:如果你已经设置好了,请跳过这个步骤
在Windows的Path路径中添加下面的地址(针对MSSQL 2008):C:\Program Files\Microsoft SQL Server\100\COM。
如果没有设置path环境变量或者设置错误,在使用tablediff的时候,会报告下面的错误:
'tablediff'is not recognized as an internal or external command,operable program or batchfile.

Step2.创建测试表并插入数据
  1. use test
  2. go
  3. --creating test table
  4. if OBJECT_ID('dbo.test_tablediff1','u') is not null
  5.         drop table dbo.test_tablediff1
  6. go

  7. create table dbo.test_tablediff1
  8. (
  9.         id int not null primary key
  10.         ,name varchar(20) not null
  11. );
  12. --data init.
  13. insert into dbo.test_tablediff1
  14. select 1,'AA'
  15. UNION ALL
  16. select 2,'BB'
  17. ;
  18. go
复制代码

Step3.创建与测试表结构相同的空表
  1. select top 1 *
  2. into dbo.test_tablediff1_bak
  3. from dbo.test_tablediff1
  4. where 1 = 2
复制代码

Step4.构造tablediff批处理文件
例如将bat文件放到D:\temp\ tablediff_test.bat,内容如下:
  1. tablediff /sourceserver "LCMIS005" /sourcedatabase "test" /sourceschema "dbo" /sourcetable "test_tablediff1" /sourceuser "sa" /sourcepassword "1qazxsw2!@#" /destinationserver "LCMIS005" /destinationdatabase "test" /destinationschema "dbo" /destinationtable "test_tablediff1_bak" /destinationuser "sa" /destinationpassword "1qazxsw2!@#" /bf "3000" /f "LCMIS005_test_dbo.test_tablediff1.sql" /t "6000"
复制代码

Step5.执行批处理文件
双击该批处理文件,直接执行就行了
批处理执行完毕,会有类似如下的提示:
Table[test].[dbo].[test_tablediff1] on LCMIS005 and Table [test].[dbo].[test_tablediff1_bak]on LCMIS005 have 2 differences.
Fix SQL written toLCMIS005_test_dbo.test_tablediff1.0.sql.
Err     id     Col
Src. Only       1
Src. Only       2
The requested operation took0.1200069 seconds.

Step6.查看生成的.sql文件
执行批处理后,生成的文件为D:\temp\ LCMIS005_test_dbo.test_tablediff1.0.sql。内容如下:
  1. -- Host: LCMIS005
  2. -- Database: [test]
  3. -- Table: [dbo].[test_tablediff1_bak]
  4. INSERT INTO [dbo].[test_tablediff1_bak] ([id],[name]) VALUES (1,N'AA')
  5. INSERT INTO [dbo].[test_tablediff1_bak] ([id],[name]) VALUES (2,N'BB')
复制代码

Step7.替换生成的sql文件中的表名称
这个使用SSMS的查找替换功能(ctrl+H),将[test_tablediff1_bak]替换为[test_tablediff1],保存即可:
  1. -- Host: LCMIS005
  2. -- Database: [test]
  3. -- Table: [dbo].[test_tablediff1]
  4. INSERT INTO [dbo].[test_tablediff1] ([id],[name]) VALUES (1,N'AA')
  5. INSERT INTO [dbo].[test_tablediff1] ([id],[name]) VALUES (2,N'BB')
复制代码


说明
1.      请大家思考,如果我们需要生成满足某个条件的INSERT语句,怎么采用类似的方法处理呢?比如:请生成满足下面语句条件的INSERT语句
  1. select *
  2. from dbo.test_tablediff1
  3. where id = 1;
复制代码

2.      如果测试表结构稍微做如下修改,我们的tablediff方法是否凑效?
  1. if OBJECT_ID('dbo.test_tablediff1','u') is not null
  2.         drop table dbo.test_tablediff1
  3. go

  4. create table dbo.test_tablediff1
  5. (
  6.         id int not null primary key
  7.         ,[newid] uniqueidentifier not null
  8.                 constraint df_newid default(newid())
  9.         ,name varchar(20) not null
  10.         ,[desc] nvarchar(max) null
  11. );

  12. insert into dbo.test_tablediff1
  13. select 1,NEWID(),'AA','Just for testing'
  14. union all
  15. select 2,NEWID(),'BB','Just for testing'
  16. ;
  17. go
复制代码

使用道具 举报

回复
论坛徽章:
14
迷宫蛋
日期:2012-03-13 09:50:292014年新春福章
日期:2014-02-18 16:44:08优秀写手
日期:2013-12-18 09:29:15迷宫蛋
日期:2012-06-13 15:28:34咸鸭蛋
日期:2012-06-11 16:11:11灰彻蛋
日期:2012-05-31 10:18:54双黄蛋
日期:2012-05-28 17:45:17茶鸡蛋
日期:2012-05-28 17:27:32蜘蛛蛋
日期:2012-05-28 16:54:09迷宫蛋
日期:2012-05-17 19:00:48
55#
 楼主| 发表于 2012-3-16 21:11 | 只看该作者
今天的分享就解决上次提出来的两个问题:
1.如果需要生成带条件的Insert语句的话,我们只需要和目的端的一个View进行tablediff即可,那么我们建立如下视图
  1. create view dbo.V_testTableDiff
  2. as
  3. select *
  4. from dbo.test_tablediff
  5. where id = 1;
复制代码
2.如果表中含有时间戳或者大字段数据类型,我们使用tablediff是无法比出来的。其实很好理解,MSSQL是不会去比较一个2GB大小的数据的。所以,MSSQL直接就不支持大数据类型。

使用道具 举报

回复
论坛徽章:
2
奥运会纪念徽章:篮球
日期:2012-11-05 16:49:012013年新春福章
日期:2013-02-25 14:51:24
56#
发表于 2012-3-16 23:03 | 只看该作者
谢谢 感觉不多啊 多分享下啊!!!!

使用道具 举报

回复
论坛徽章:
14
迷宫蛋
日期:2012-03-13 09:50:292014年新春福章
日期:2014-02-18 16:44:08优秀写手
日期:2013-12-18 09:29:15迷宫蛋
日期:2012-06-13 15:28:34咸鸭蛋
日期:2012-06-11 16:11:11灰彻蛋
日期:2012-05-31 10:18:54双黄蛋
日期:2012-05-28 17:45:17茶鸡蛋
日期:2012-05-28 17:27:32蜘蛛蛋
日期:2012-05-28 16:54:09迷宫蛋
日期:2012-05-17 19:00:48
57#
 楼主| 发表于 2012-3-17 20:15 | 只看该作者
itfy 发表于 2012-3-16 23:03
谢谢 感觉不多啊 多分享下啊!!!!

你有点贪心哦~~虽然我没有去数到底有多少个主题,但也应该也不少了哦

使用道具 举报

回复
论坛徽章:
14
迷宫蛋
日期:2012-03-13 09:50:292014年新春福章
日期:2014-02-18 16:44:08优秀写手
日期:2013-12-18 09:29:15迷宫蛋
日期:2012-06-13 15:28:34咸鸭蛋
日期:2012-06-11 16:11:11灰彻蛋
日期:2012-05-31 10:18:54双黄蛋
日期:2012-05-28 17:45:17茶鸡蛋
日期:2012-05-28 17:27:32蜘蛛蛋
日期:2012-05-28 16:54:09迷宫蛋
日期:2012-05-17 19:00:48
58#
 楼主| 发表于 2012-3-17 20:24 | 只看该作者
本帖最后由 Cherish_j_wang 于 2012-3-17 20:25 编辑

MSSQL DBA 精华总结

之MSSQL查看IP和端口号
使用MSSQLServer查看主机名和MSSQL Server的端口号方法的脚本如下:

  1. DECLARE
  2.         @tcpEndport VARCHAR(20)
  3.         ,@regeditKey VARCHAR(100)
  4. ;
  5. --------============open xp_cmdshell
  6. IF EXISTS (
  7. SELECT TOP 1 *
  8. FROM sys.configurations WITH (NOLOCK)
  9. WHERE name='xp_cmdshell' and value=0)
  10. BEGIN
  11. EXEC master.dbo.sp_configure 'show advanced options', 1
  12. RECONFIGURE WITH OVERRIDE
  13. EXEC master.dbo.sp_configure 'xp_cmdshell', 1
  14. RECONFIGURE WITH OVERRIDE

  15. END
  16. --------============end open xp_cmdshell
  17. declare @tb_output TABLE
  18. (
  19. OutPut NVARCHAR(max)
  20. )

  21. INSERT INTO @tb_output
  22. exec sys.xp_cmdshell 'ipconfig'


  23. IF @@VERSION LIKE 'Microsoft SQL Server  2000%'--SQLServer 2000
  24. BEGIN
  25.         SET @regeditKey= N'SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\SuperSocketNetLib\Tcp'
  26.         EXEC  master.dbo.xp_regread   
  27.                                 @rootkey='HKEY_LOCAL_MACHINE'   
  28.                                  ,@key= @regeditKey
  29.                                  ,@value_name='TcpPort'   
  30.                                  ,@value=@tcpEndport   OUTPUT
  31.         SELECT @tcpEndport        
  32. END
  33. ELSE IF (@@VERSION LIKE 'Microsoft SQL Server 2005%' OR @@VERSION LIKE 'Microsoft SQL Server 2008%')
  34. BEGIN
  35.         IF @@Servicename='MSSQLSERVER'--Default instance
  36.         BEGIN
  37.                 SET @regeditKey='SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\SuperSocketNetLib\Tcp'
  38.         END
  39.         ELSE
  40.         BEGIN
  41.                 SET @regeditKey= 'SOFTWARE\Microsoft\Microsoft SQL Server\'+@@Servicename+'\MSSQLServer\SuperSocketNetLib\Tcp'
  42.         END
  43.         EXEC  master.dbo.xp_regread   
  44.                                         @rootkey='HKEY_LOCAL_MACHINE'   
  45.                                          ,@key= @regeditKey
  46.                                          ,@value_name='TcpPort'   
  47.                                          ,@value=@tcpEndport   OUTPUT
  48.         SELECT
  49.                 ServerName = @@SERVERNAME
  50.                 ,Ipadd = OutPut
  51.                 ,@tcpEndport AS tcp_Endpoint
  52.         FROM @tb_output
  53.         WHERE OutPut LIKE '%IP%Address%'
  54. END        
  55. ELSE
  56.         SELECT 'Unknown'
复制代码

我的结果集:
ServerName        Ipadd                                                                tcp_Endpoint
LCMIS005           IPv4 Address. . . . . . . . . . . : 192.168.1.100        1433


使用道具 举报

回复
论坛徽章:
26
ITPUB伯乐
日期:2012-05-22 15:05:35喜羊羊
日期:2015-05-14 12:15:30美羊羊
日期:2015-07-02 22:22:59秀才
日期:2015-08-24 09:51:48天枰座
日期:2015-11-05 16:53:35双鱼座
日期:2015-12-05 19:22:56巨蟹座
日期:2015-12-20 18:46:10摩羯座
日期:2016-05-19 09:54:17ITPUB15周年纪念
日期:2016-10-13 13:15:34秀才
日期:2017-02-22 15:16:26
59#
发表于 2012-3-19 08:32 | 只看该作者
Cherish_j_wang 发表于 2012-3-14 20:08
发啥子红包嘛~~

转账转出        pub币 -1000        向 Cherish_j_wang 进行积分转帐        2012-03-19 08:31

使用道具 举报

回复
论坛徽章:
0
60#
发表于 2012-3-19 11:03 | 只看该作者
支持!好贴

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表