<?xml version="1.0" encoding="utf-8"?><Snippet><Entry KeyWord="index,primary key,CONSTRAINT(2011)" ActionWord=" " Tipo="1" Flag="0">USE [Warehouse]
GO
/* BYDBA 1 不建议使用联合主键,而是用自增列配合"创建唯一约束"或"创建唯一索引"
--创建唯一约束的方法
CREATE TABLE tb_test
(
id INT IDENTITY NOT NULL,
UniqueASNNumber CHAR(10) NOT NULL,
PackageLabel CHAR(12) NOT NULL constraint DF_tb_PackageLabel default(''),
CONSTRAINT PK_TABLE PRIMARY KEY (id),
CONSTRAINT UK_TABLE UNIQUE (PackageLabel, UniqueASNNumber)
)
--创建唯一索引的方法
CREATE UNIQUE NONCLUSTERED INDEX [IXU_TABLE_CODE1_CODE2] ON dbo.[TABLE]
(
[Code1],[Code2]
)WITH (FILLFACTOR=90) ON [PRIMARY]
*/
--覆盖索引
create nonclustered index ix_itemRateOfCustomer_item_CountryCode_CompanyCode on itemRateOfCustomer
(item) include(CountryCode,CompanyCode) WITH (FILLFACTOR=90) ON [PRIMARY]
--添加主键----------
ALTER TABLE 表名
ADD CONSTRAINT [PK_表名] PRIMARY KEY CLUSTERED(ID,Name)
--添加主键已经其他属性
ALTER TABLE ttt WITH NOCHECK
ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID PRIMARY KEY CLUSTERED (id)
WITH (FILLFACTOR = 75, ONLINE = ON, PAD_INDEX = ON);
---删除主键--------------
ALTER TABLE DropShipPickingShortage
Drop CONSTRAINT PK_DropShipPickingShortage
---创建索引
CREATE NONCLUSTERED INDEX IX_TABLE1_FIELD ON dbo.TABLE1
(
[FIELD] ASC
)WITH (FILLFACTOR = 90) ON [PRIMARY]
--删除索引----------------
IF EXISTS (
SELECT 1 FROM sys.indexes WITH(NOLOCK)
WHERE object_id = OBJECT_ID(N'[dbo].[arinvt01]') AND [name] = N'IX_arinvt01_filed'
)
DROP INDEX IX_arinvt01_filed ON [dbo].[arinvt01] WITH ( ONLINE = OFF )
--删除列----------------
alter table ItemXmlProperties
drop column TransactionNumber
--删除统计信息-----------------
IF EXISTS (
SELECT 1
FROM sys.stats WITH(NOLOCK)
WHERE object_id = OBJECT_ID(N'[dbo].[arinvt01]')
AND [name] = N'Statistic_BEG_ACC')
DROP STATISTICS [dbo].[Arinvt01].[Statistic_BEG_ACC]
---添加默认属性
ALTER TABLE [dbo].[IM_ItemPriceChangeBuffer]
ADD CONSTRAINT DF_IM_ItemPriceChangeBuffer_PromotionDescription
DEFAULT ('') FOR PromotionDescription
GO
---添加默认属性跟新现有行
ALTER TABLE dbo.doc_exf
ADD AddDate smalldatetime NULL
CONSTRAINT DF_doc_exf_AddDate
DEFAULT GETDATE() WITH VALUES ;
-----删除默认属性
if exists(
select 1 from sys.default_constraints
where parent_object_id =object_id('IM_Warranty')
and name='DF_IM_Warranty_WarrantyName'
)
ALTER TABLE IM_Warranty DROP CONSTRAINT DF_Jobs_JobId
------添加新列,约束
ALTER TABLE dbo.doc_exc
ADD column_b VARCHAR(20) NULL
CONSTRAINT exb_unique UNIQUE ;
---添加约束,将使用WITH NOCHECK 以避免根据现有行验证该约束,从而允许添加该约束。
ALTER TABLE dbo.doc_exd
WITH NOCHECK
ADD CONSTRAINT exd_check CHECK (column_a > 1) ;
----更改列的排序规则
ALTER TABLE T3
ALTER COLUMN C2 varchar(50) COLLATE Latin1_General_BIN
GO
------添加外键---------
ALTER TABLE Person.ContactBackup
ADD CONSTRAINT FK_ContactBacup_Contact FOREIGN KEY (ContactID)
REFERENCES Person.Person (BusinessEntityID) ;
--配置表的更改跟踪
--下面的示例启用AdventureWorks2008R2 数据库中Person.Person 表的更改跟踪。
USE AdventureWorks2008R2;
ALTER TABLE Person.Person
ENABLE CHANGE_TRACKING;
--下面的示例启用更改跟踪,并启用在进行某项更改期间会进行更新的列的跟踪。
USE AdventureWorks2008R2;
ALTER TABLE Person.Person
ENABLE CHANGE_TRACKING
WITH (TRACK_COLUMNS_UPDATED = ON)
--下面的示例禁用AdventureWorks2008R2 数据库中Person.Person 表的更改跟踪。
USE AdventureWorks2008R2;
ALTER TABLE Person.Person
DISABLE CHANGE_TRACKING;
-----下面的三个语句添加名为CS 的列集,然后将列C2 和C3 修改为SPARSE。
ALTER TABLE T2
ADD CS XML COLUMN_SET FOR ALL_SPARSE_COLUMNS ;
GO
ALTER TABLE T2
ALTER COLUMN C2 ADD SPARSE ;
GO
ALTER TABLE T2
ALTER COLUMN C3 ADD SPARSE ;
GO
--------------------------禁用约束,启用约束-------------------
CREATE TABLE dbo.cnst_example
(id INT NOT NULL,
name VARCHAR(10) NOT NULL,
salary MONEY NOT NULL
CONSTRAINT salary_cap CHECK (salary < 100000)
);
-- Valid inserts
INSERT INTO dbo.cnst_example VALUES (1,'Joe Brown',65000);
INSERT INTO dbo.cnst_example VALUES (2,'Mary Smith',75000);
-- This insert violates the constraint.
INSERT INTO dbo.cnst_example VALUES (3,'Pat Jones',105000);
-- Disable the constraint and try again.
ALTER TABLE dbo.cnst_example NOCHECK CONSTRAINT salary_cap;
INSERT INTO dbo.cnst_example VALUES (3,'Pat Jones',105000);
-- Re-enable the constraint and try another insert; this will fail.
ALTER TABLE dbo.cnst_example CHECK CONSTRAINT salary_cap;
INSERT INTO dbo.cnst_example VALUES (4,'Eric James',110000) ;
</Entry><Entry KeyWord="Query Job
(2011)" ActionWord=" " Tipo="1" Flag="0">--CMD Query Job
use msdb
go
select * from dbo.sysjobs a
inner join dbo.sysjobsteps b
on a.job_id = b.job_id
where b.command like '%UP_EC_InsertRMAExtendedWarrantyItem%'
--CMD Query Job
use msdb
go
sp_help_jobschedule @job_id =''
</Entry><Entry KeyWord="_MarkDelete sp_rename(2011)" ActionWord=" " Tipo="1" Flag="0"> _MarkDelete_20090311_UP_SPNAME
---rename 主键
EXEC sp_rename '[ItemPriceSetting].PK_tmp_ItemPriceSetting','PK_ItemPriceSetting','index'
EXEC sp_rename '[tmp_ItemPriceSetting]','ItemPriceSetting'</Entry><Entry KeyWord="Query Replication(2011)" ActionWord="#queryRep" Tipo="1" Flag="0">use distribution
go
select *,(select drop_publication as [*] FOR XML PATH ('root'),TYPE ) from
(
SELECT
DISTINCT p.publication
,ss.name AS subscriber
,p.publisher_db
,a.article
,s.Subscriber_DB --,ss.server_id,P.*
,CHAR(10)+CHAR(10)+
'use '+p.publisher_db+CHAR(10)+' go'+CHAR(10)+
'EXEC sp_Dropsubscription @publication = N'''+p.publication+''''+CHAR(10)+
',@subscriber = N'''+ss.name+''''+CHAR(10)+
',@destination_db = N'''+Subscriber_DB+''''+CHAR(10)+
',@article = N'''+a.article+''''+CHAR(10)+
'EXEC sp_DropArticle @publication = N'''+p.publication+''''+CHAR(10)+
',@article = N'''+a.article+''''+CHAR(10)+CHAR(10)
as drop_publication
FROM dbo.MSsubscriptions AS s WITH (NOLOCK)
INNER JOIN sys.servers AS ss WITH (NOLOCK)
ON s.subscriber_id =ss.server_id
INNER JOIN dbo.MSpublications AS p WITH (NOLOCK)
ON p.publisher_id=s.publisher_id
AND p.publisher_db=s.publisher_db
AND p.publication_id = s.publication_id
INNER JOIN dbo.MSarticles AS a
ON p.publisher_id=a.publisher_id
AND p.publisher_db=a.publisher_db
AND p.publication_id = a.publication_id
WHERE
a.article ='SAPSD_MKP_InventoryStorageFee'
) C</Entry><Entry KeyWord="ipaddress(2011)" ActionWord=" " Tipo="1" Flag="0">
select distinct @@SERVERNAME server,local_net_address as ip,local_tcp_port sqlport from sys.dm_exec_connections
where net_transport='tcp' and protocol_type='tsql'
SELECT @@SERVERNAME, name,port FROM master.sys.tcp_endpoints
where [type]=3 and type_desc='SERVICE_BROKER'
</Entry><Entry KeyWord="动态 sp_executesql (2011)" ActionWord=" " Tipo="1" Flag="0">declare @num int,@sql nvarchar(4000),@count int;
set @num=245;
set @sql=N'select @count1=count(*) from dbo.tb_ErrorLog where error_number=@num1';
exec sp_executesql @sql, N'@num1 int,@count1 int output', @num1=@num,@count1=@count output
select @count
--- like 传参数
declare @sql nvarchar(4000)
set @sql='select * from tb where name like @name'
exec sp_executesql @sql ,N'@name varchar(50)',@name='%fs%'
</Entry><Entry KeyWord="job disable&amp;rename(2011)" ActionWord=" " Tipo="1" Flag="0">
use msdb
go
EXEC msdb..sp_update_job @job_name = N'job',
@new_name = N'MarkDelete_20100923_job',@enabled=0
</Entry><Entry KeyWord="查看hosts 文件(2011)" ActionWord=" " Tipo="1" Flag="0">declare @t table
(
id int identity(1,1)
,text varchar(max)
)
Insert into @t
EXEC xp_cmdshell 'type C:\Windows\System32\Drivers\etc\hosts'
select *
from @t
where Text not like '#%'</Entry><Entry KeyWord="user create hash password login(2011)" ActionWord=" " Tipo="1" Flag="0">--寻找用户的hashword
SELECT password_hash, *
FROM sys.sql_logins L WITH(NOLOCK)
where name='edidbo'
--根据hashword 创建用户
CREATE LOGIN [EDIDbo]
WITH PASSWORD = 0x0100352AC183ADC9C0CEDA851011598D01ADC088449D8D4309C9
HASHED, SID = 0x26D34F54B8DE3446ABB74D4AE058FBD3,
CHECK_POLICY = OFF,
CHECK_EXPIRATION = OFF
</Entry><Entry KeyWord="bcp out(2011)" ActionWord=" " Tipo="1" Flag="0">BCP "ItemMaintainNewegg.dbo.arinvt01" OUT "arinvt01" /N /U RepDbo /P Rep@Dbo /S "S7QSQL07\D2WHP01"
pause</Entry><Entry KeyWord="bcp in(2011)" ActionWord=" " Tipo="1" Flag="0">BCP "ITEMMAINTAIN.dbo.arinvt01" In "arinvt01" /N /E /q /k /U RepDbo /P Rep@Dbo /b 50000 /S "S7QSQL01\ABS_SQL"
pause</Entry><Entry KeyWord="replication 同步 条件 查询(2011)" ActionWord=" " Tipo="1" Flag="0">
use DBAMonitor
GO
--EXEC ReplicationInfo.P_ReplicationInfo
-- @search_object = N'dropshipmaster'
--GO
select *
from ReplicationInfo.v_Info
where article_name IN( 'NewEgg_SOMaster','Newegg_SoTransaction')
--and publisher_server = 'D2whp01'
--select * from sys.views
--where schema_name(schema_id) = 'ReplicationInfo'
---查询同步历史条件
select *
from ReplicationInfo.tb_Info
where article_name IN( 'NewEgg_SOMaster','Newegg_SoTransaction')
and row_filter is not null
--and publisher_server = 'D2whp01'</Entry><Entry KeyWord="replication 更新订阅状态(2011)" ActionWord=" " Tipo="1" Flag="0">--Publisher
/*Replication Error
1.The subscription(s) have been marked inactive and must be reinitialized.
NoSync subscriptions will need to be dropped and recreated.
*/
set nocount on
use distribution
go
select *
from dbo.MSsubscriptions with (NOLOCK)
where status=0
/*
update distribution.dbo.MSsubscriptions
set status = 0
where publisher_id = 0
and publisher_db = 'imk'
and publication_id =68
and subscriber_id = 12
and subscriber_db = 'imk'
*/
SET NOCOUNT ON
declare @sql nvarchar(max)
set @sql=N''
select @sql=@sql+N'USE distribution'+char(10)+N'GO'+char(10)
+N'update distribution.dbo.MSsubscriptions'
+char(10)+N'set status = 2'
+char(10)+N'where publisher_id='+CAST(publisher_id AS varchar)
+char(10)+N'and publisher_db = '''+publisher_db+''''
+char(10)+N'and publication_id ='+CAST(publication_id AS varchar)
+char(10)+N'and subscriber_id = '+CAST(subscriber_id AS varchar)
+char(10)+N'and subscriber_db = '''+subscriber_db+''''
+char(10)+N'GO'+char(10)
from distribution.dbo.MSsubscriptions with (NOLOCK)
where status=0
print @sql--(Copy出来执行就是了)
/*
The process could not connect to Subscriber 'XXXX'
1.network issue:Telnet
2.User and password are wrong
修改Subscribers property中的用户和密码
*/</Entry><Entry KeyWord="replication job(2011)" ActionWord=" " Tipo="1" Flag="0">EXEC msdb.dbo.sp_stop_job @job_name = N'S7QSQL05\S7EDIDB01-MKTPLS-Rp_MKTPLS_EHISSQL.MKT-S7QSQL04\EHISSQL-32'
EXEC msdb.dbo.sp_start_job @job_name = N'S7QSQL05\S7EDIDB01-MKTPLS-Rp_MKTPLS_EHISSQL.MKT-S7QSQL04\EHISSQL-32'</Entry><Entry KeyWord="TRIGGER (2011)" ActionWord=" " Tipo="1" Flag="0">/****** Object: DdlTrigger [TR_SRV_DBA_DDL_ALL] Script Date: 12/18/2010 19:23:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [TR_SRV_DBA_DDL_ALL]
ON ALL SERVER
WITH
EXECUTE AS N'sa'
FOR
DDL_SERVER_LEVEL_EVENTS,
DDL_DATABASE_LEVEL_EVENTS
AS
SET NOCOUNT ON;
SET ANSI_PADDING ON;
INSERT temptable.dbo.tb_DBA_DDL_All_master(
event_data
)
OUTPUT
inserted.id as id,
inserted.event_data.value(N'(/EVENT_INSTANCE/EventType/text())[1]', N'nvarchar(260)') as event_type,
inserted.event_data.value(N'(/EVENT_INSTANCE/PostTime/text())[1]', N'datetime') as post_time,
inserted.event_data.value(N'(/EVENT_INSTANCE/LoginName/text())[1]', N'nvarchar(260)') as login_name,
inserted.event_data.value(N'(/EVENT_INSTANCE/ServerName/text())[1]', N'nvarchar(260)') as server_name,
inserted.event_data.value(N'(/EVENT_INSTANCE/DatabaseName/text())[1]', N'nvarchar(260)') as database_name,
inserted.event_data.value(N'(/EVENT_INSTANCE/SchemaName/text())[1]', N'nvarchar(260)') as schema_name,
inserted.event_data.value(N'(/EVENT_INSTANCE/ObjectType/text())[1]', N'nvarchar(260)') as object_type,
inserted.event_data.value(N'(/EVENT_INSTANCE/ObjectName/text())[1]', N'nvarchar(260)') as object_name,
inserted.event_data.value(N'(/EVENT_INSTANCE/TSQLCommand/CommandText/text())[1]', N'nvarchar(max)') as command
INTO temptable.dbo.tb_DBA_DDL_All_detial(
master_id,
event_type, post_time, login_name,
server_name, database_name, schema_name, object_type, object_name,
command
)
VALUES(
EVENTDATA()
);
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
ENABLE TRIGGER [TR_SRV_DBA_DDL_ALL] ON ALL SERVER
GO
</Entry><Entry KeyWord="user与role的对应关系(2011)" ActionWord=" " Tipo="1" Flag="0">
declare @RoleName varchar(50), @UserName varchar(50), @CMD varchar(1000)
declare @databaseName varchar(50)
set @databaseName='test'
set @UserName = 'yind'
create Table #UserRoles(DatabaseName varchar(50),Role varchar(50))
create table #RoleMember
(DBRole varchar(100),
MemberName varchar(100),
MemberSid varbinary(2048))
set @CMD = 'use ?
truncate table #RoleMember
insert into #RoleMember
exec sp_helprolemember
insert into #UserRoles
(DatabaseName, Role)
select db_name(), dbRole
from #RoleMember
where MemberName = ''' + @UserName + ''''
exec sp_MSForEachDB @CMD
select * from #UserRoles
where @databaseName='' or DatabaseName=@databaseName
drop table #UserRoles
drop table #RoleMember</Entry><Entry KeyWord="select 查询只存在一种数据(2011)" ActionWord=" " Tipo="1" Flag="0">
use test
go
DECLARE @ItemList TABLE(
TransactionNumber INT IDENTITY(1,1) PRIMARY KEY,
ItemNumber CHAR(25)
)
INSERT INTO @ItemList(ItemNumber) VALUES ('GC-000-001')
INSERT INTO @ItemList(ItemNumber) VALUES ('GC-000-003')
if exists
(
select top 1 1 from
(
select COUNT(*) total ,sum(case when ItemNumber='GC-000-001' then 1 end) item from @ItemList
)c
where total=item and total<>0
)
SELECT 1
ELSE
SELECT 0
IF EXISTS
(
SELECT TOP 1 1 FROM @ItemList t WHERE ItemNumber = 'GC-000-001'
and not exists
( select top 1 1 from @ItemList c where c.ItemNumber<>'GC-000-001')
)
SELECT 1
ELSE
SELECT 0
</Entry><Entry KeyWord="删除identity列(2011)" ActionWord=" " Tipo="1" Flag="0">USE NewEgg
GO
ALTER TABLE [SerialNumber]
switch to [tmp_SerialNumber]
IF EXISTS(SELECT TOP 1 1 FROM [tmp_SerialNumber] WITH (NOLOCK))
DROP TABLE [SerialNumber]
ELSE
BEGIN
IF EXISTS(SELECT TOP 1 1 FROM [SerialNumber] WITH (NOLOCK))
RAISERROR('switch failed',16,1)
END
EXEC sp_rename '[tmp_SerialNumber]','SerialNumber'
EXEC sp_rename '[SerialNumber].PK_tmp_SerialNumber','PK_SerialNumber','index'
GO
</Entry><Entry KeyWord="创建删除fulltext (2011)" ActionWord=" " Tipo="1" Flag="0">
USE [eCommerce2005]
GO
--create catalog
CREATE FULLTEXT CATALOG [ftTestDBA]WITH ACCENT_SENSITIVITY = ON
AUTHORIZATION [dbo]
---创建全文索引
CREATE FULLTEXT INDEX ON [dbo].EC_AllocateInventory_Log--表
(
Memo LANGUAGE [English], --col
InUser LANGUAGE [English]--col
)
KEY INDEX [PK_EC_AllocateInventory_Log]--主键,唯一索引
ON ([ftTestDBA], --fulltext catalog
FILEGROUP [PRIMARY])
WITH (CHANGE_TRACKING = AUTO, STOPLIST = SYSTEM)
----删除全文索引
--DROP FULLTEXT INDEX ON EC_AllocateInventory_Log
--DROP FULLTEXT CATALOG [ftTestDBA]
</Entry><Entry KeyWord="注册表regedit(2011)" ActionWord=" " Tipo="1" Flag="0">Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\ConnectTo]
"DSQUERY"="DBNETLIB"
"S1DSQL01\\ABS_SQL"="DBMSSOCN,10.1.25.21,1433"
"S1DSQL01\\S7EIM01"="DBMSSOCN,10.1.25.21,41433"
"S1DSQL02\\S5RMADB01"="DBMSSOCN,10.1.25.22,1433"
"S1DSQL02\\D2HIS01"="DBMSSOCN,10.1.25.22,41433"
"S1DSQL03\\NEWSQL2"="DBMSSOCN,10.1.25.23,1433"
"S1DSQL04\\EHISSQL"="DBMSSOCN,10.1.25.24,1433"
"S1DSQL05\\APPSQL"="DBMSSOCN,10.1.25.25,41433"
"S7DSQL09\\S7FRA01"="DBMSSOCN,10.1.25.29,1433"
"S7DSQL09\\S7HISDB01"="DBMSSOCN,10.1.25.29,41433"
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSSQLServer\Client\ConnectTo]
"S1DSQL01\\ABS_SQL"="DBMSSOCN,10.1.25.21,1433"
"S1DSQL01\\S7EIM01"="DBMSSOCN,10.1.25.21,41433"
"S1DSQL02\\S5RMADB01"="DBMSSOCN,10.1.25.22,1433"
"S1DSQL02\\D2HIS01"="DBMSSOCN,10.1.25.22,41433"
"S1DSQL03\\NEWSQL2"="DBMSSOCN,10.1.25.23,1433"
"S1DSQL04\\EHISSQL"="DBMSSOCN,10.1.25.24,1433"
"S1DSQL05\\APPSQL"="DBMSSOCN,10.1.25.25,41433"
"S7DSQL09\\S7FRA01"="DBMSSOCN,10.1.25.29,1433"
"S7DSQL09\\S7HISDB01"="DBMSSOCN,10.1.25.29,41433"</Entry><Entry KeyWord="replication datacache(2011)" ActionWord=" " Tipo="1" Flag="0">
--ehissql
USE NCustomer
GO
SELECT
*
FROM dbo.sysarticles ART WITH(NOLOCK)
WHERE objid = OBJECT_ID(N'Newegg_Customer')
AND EXISTS(
SELECT 1
FROM dbo.syssubscriptions SUB WITH(NOLOCK)
WHERE ART.artid = SUB.artid
AND SUB.srvid <> -1 AND dest_db <> N'virtual'
AND SUB.srvname = @@SERVERNAME
AND SUB.dest_db = 'Datacache'
)
use DataCache
go
sp_helptext [sp_MSins__NCustomer_DBONewegg_Customer]
sp_helptext [sp_MSupd_NCustomer_DBONewegg_Customer]</Entry><Entry KeyWord="dts 导入identity数据(2011)" ActionWord=" " Tipo="1" Flag="0">dts可以导入identity数据,需要选择目的表的时候,设置 edit mappings.
设置 enable identity insert 为on
dts 可以只导入一些列,非所用列
</Entry><Entry KeyWord="bcp 导入identity列(2011)" ActionWord=" " Tipo="1" Flag="0">BCP in,
加-E可以显式指定IDENTITY列值
不加-E。自增列累加递增</Entry><Entry KeyWord="sql 导出excel(2011)" ActionWord=" " Tipo="1" Flag="0">
1、在SQL SERVER里查询Excel数据:
-- ======================================================
SELECT *
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\book1.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...[Sheet1$]
下面是个查询的示例,它通过用于 Jet 的 OLE DB 提供程序查询 Excel 电子表格。
SELECT *
FROM OpenDataSource ( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
-------------------------------------------------------------------------------------------------
2、将Excel的数据导入SQL server :
-- ======================================================
SELECT * into newtable
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\book1.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...[Sheet1$]
实例:
SELECT * into newtable
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
-------------------------------------------------------------------------------------------------
3、将SQL SERVER中查询到的数据导成一个Excel文件
-- ======================================================
T-SQL代码:
EXEC master..xp_cmdshell 'bcp 库名.dbo.表名out c:\Temp.xls -c -q -S"servername" -U"sa" -P""'
参数:S 是SQL服务器名;U是用户;P是密码
说明:还可以导出文本文件等多种格式
实例:
EXEC master..xp_cmdshell 'bcp saletesttmp.dbo.CusAccount out c:\temp1.xls -c -q -S"pmserver" -U"sa" -P"sa"'
EXEC master..xp_cmdshell 'bcp "SELECT au_fname, au_lname FROM pubs..authors ORDER BY au_lname" queryout C:\ authors.xls -c -Sservername -Usa -Ppassword'
在VB6中应用ADO导出EXCEL文件代码:
Dim cn As New ADODB.Connection
cn.open "Driver={SQL Server};Server=WEBSVR;DataBase=WebMis;UID=sa;WD=123;"
cn.execute "master..xp_cmdshell 'bcp "SELECT col1, col2 FROM 库名.dbo.表名" queryout E:\DT.xls -c -Sservername -Usa -Ppassword'"
------------------------------------------------------------------------------------------------
4、在SQL SERVER里往Excel插入数据:
-- ======================================================
insert into OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\Temp.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...table1 (A1,A2,A3) values (1,2,3)
T-SQL代码:
INSERT INTO
OPENDATASOURCE('Microsoft.JET.OLEDB.4.0',
'Extended Properties=Excel 8.0;Data source=C:\training\inventur.xls')...[Filiale1$]
(bestand, produkt) VALUES (20, 'Test')
insert into openrowset('Microsoft.Jet.OLEDB.4.0','EXCEL 8.0;HDR=YES;User id=admin;Password=;IMEX=1;
DATABASE=D:\Roy.xls', sheet1$)--(ID,Name)
select 2,'b'
insert into OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 8.0;HDR=YES;DATABASE=D:\Roy.xls',sheet1$)(ID,Name)
select 2,'b'
</Entry><Entry KeyWord="汇编 move(2011)" ActionWord=" " Tipo="1" Flag="0">mov xxx, dword ptr ds:[xxxxxxxx] dword 双字取DS段[XXXXXXXX] 中的数据,给出了段寄存器
mov xxx, dword ptr [xxxxxxxx] 没有给出段寄存器,取默认段
mov xxx, [xxxxxxxx] 直接寻址
</Entry><Entry KeyWord="汇编 mov ecx(2011)" ActionWord=" " Tipo="1" Flag="0">mov [ECX+EAX*4],edx
因为[ECX+EAX*4]就相当于一个数组里的某个下标值变量.
例如i是个数组,可以理解成这样 i[eax] = edx
这是一个数组 通常情况是在找背包物品基址的时候才出现的,
如金创药当前的物品下表为(也就是第一个格子) ,
那么eax就等于,也就是说,[ECX+0*4] 所以一般只要搜索ECX的值就行了,
这么说只是方便楼主理解吧!</Entry><Entry KeyWord="汇编 寄存器(2011)" ActionWord=" " Tipo="1" Flag="0">在8086里面,16位通用寄存器为ax,bx,cx,dx,
在80386里,寄存器为32位,对应8086,即为eax,ebx,ecx,edx
dword ptr fs:[0] 表示fs*16+0处的一个双字
另外,div ebx 即 (edx,eax)/ebx
这里显然应为mov edx,0 ,或者直接用CDQ对cdx进行扩展,CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)
整个代码的意思就是:
先将00501a32入栈,再将fs*16+0处的一个双字入栈,再做除法
(edx,eax)/ebx
附:关于寄存器:
计算机寄存器分类简介:
32位CPU所含有的寄存器有:
4个数据寄存器(EAX、EBX、ECX和EDX)
2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)
6个段寄存器(ES、CS、SS、DS、FS和GS)
1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)
1、数据寄存器
数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。
对低16位数据的存取,不会影响高16位的数据。
这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。
4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。
程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。
寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。可用于乘、 除、输入/输出等操作,使用频率很高;
寄存器EBX称为基地址寄存器(Base Register)。它可作为存储器指针来使用;
寄存器ECX称为计数寄存器(Count Register)。
在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;
寄存器EDX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,
在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,
而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
2、变址寄存器
32位CPU有2个32位通用寄存器ESI和EDI。
其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。
寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,
用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的功能。
3、指针寄存器
其低16位对应先前CPU中的BP和SP,对低16位数据的存取,不影响高16位的数据。
32位CPU有2个32位通用寄存器EBP和ESP。
它们主要用于访问堆栈内的存储单元,并且规定:
EBP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据;
ESP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶。
寄存器EBP、ESP、BP和SP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,
用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
指针寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
4、段寄存器
段寄存器是根据内存分段的管理模式而设置的。内存单元的物理地址由段寄存器的值和一个偏移量组合而成
的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址。
CPU内部的段寄存器:
ECS——代码段寄存器(Code Segment Register),其值为代码段的段值;
EDS——数据段寄存器(Data Segment Register),其值为数据段的段值;
EES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
ESS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值;
EFS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
EGS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。
在16位CPU系统中,它只有4个段寄存器,所以,程序在任何时刻至多有4个正在使用的段可直接访问;在32位
微机系统中,它有6个段寄存器,所以,在此环境下开发的程序最多可同时访问6个段。
32位CPU有两个不同的工作方式:实方式和保护方式。在每种方式下,段寄存器的作用是不同的。有关规定简
单描述如下:
实方式: 前4个段寄存器CS、DS、ES和SS与先前CPU中的所对应的段寄存器的含义完全一致,内存单元的逻辑
地址仍为“段值:偏移量”的形式。为访问某内存段内的数据,必须使用该段寄存器和存储单元的偏移量。
保护方式: 在此方式下,情况要复杂得多,装入段寄存器的不再是段值,而是称为“选择子”(Selector)的某个值。。
5、指令指针寄存器
32位CPU把指令指针扩展到32位,并记作EIP,EIP的低16位与先前CPU中的IP作用相同。
指令指针EIP、IP(Instruction Pointer)是存放下次将要执行的指令在代码段的偏移量。
在具有预取指令功能的系统中,下次要执行的指令通常已被预取到指令队列中,除非发生转移情况。
所以,在理解它们的功能时,不考虑存在指令队列的情况。
6、标志寄存器
一、运算结果标志位
1、进位标志CF(Carry Flag)
进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。
使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。
2、奇偶标志PF(Parity Flag)
奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。
利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。
3、辅助进位标志AF(Auxiliary Carry Flag)
在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:
(1)、在字操作时,发生低字节向高字节进位或借位时;
(2)、在字节操作时,发生低4位向高4位进位或借位时。
对以上6个运算结果标志位,在一般编程情况下,标志位CF、ZF、SF和OF的使用频率较高,而标志位PF和AF的使用频率较低。
4、零标志ZF(Zero Flag)
零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。
5、符号标志SF(Sign Flag)
符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。
6、溢出标志OF(Overflow Flag)
溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。
“溢出”和“进位”是两个不同含义的概念,不要混淆。</Entry><Entry KeyWord="汇编 有符号数和无符号数探讨(2011)" ActionWord=" " Tipo="1" Flag="0">汇编补码
若是单字节
就看最高位是否为1,为1就为负数,为0为正数
对负数求单字节补码就可以知道负多少
若是双字节就看高8位字节的最高位是否为1,为1就为负数,为0为正数
对负数求双字节补码就可以知道负多少
-20机器中的是
10010100 负数源码
11101011 反码
11101100 补码(计算机存储)128+64+32+8+4=236
运算-20,加2 的结果
11101100
---+
00000010
------------
11101110 (如果是正数238)
取反+1=补码
10010001+1=10010010=-18
有符号数和无符号数探讨
这个问题,要是简单的理解,是很容易的,不过要是考虑的深了,还真有些东西呢。
下面我就把这个东西尽量的扩展一点,深入一点和大家说说。
一、只有一个标准!
在汇编语言层面,声明变量的时候,没有 signed 和 unsignde 之分,汇编器统统,将你输入的整数字面量当作有符号数处理成补码存入到计算机中,只有这一个标准!汇编器不会区分有符号还是无符号然后用两个标准来处理,它统统当作有符号的!并且统统汇编成补码!也就是说,db -20 汇编后为:EC ,而 db 236 汇编后也为 EC 。这里有一个小问题,思考深入的朋友会发现,db 是分配一个字节,那么一个字节能表示的有符号整数范围是:-128 ~ +127 ,那么 db 236 超过了这一范围,怎么可以?是的,+236 的补码的确超出了一个字节的表示范围,那么拿两个字节(当然更多的字节更好了)是可以装下的,应为:00 EC,也就是说 +236的补码应该是00 EC,一个字节装不下,但是,别忘了“截断”这个概念,就是说最后汇编的结果被截断了,00 EC 是两个字节,被截断成 EC ,所以,这是个“美丽的错误”,为什么这么说?因为,当你把 236 当作无符号数时,它汇编后的结果正好也是 EC ,这下皆大欢喜了,虽然汇编器只用一个标准来处理,但是借用了“截断”这个美丽的错误后,得到的结果是符合两个标准的!也就是说,给你一个字节,你想输入有符号的数,比如 -20 那么汇编后的结果是符合有符号数的;如果你输入 236 那么你肯定当作无符号数来处理了(因为236不在一个字节能表示的有符号数的范围内啊),得到的结果是符合无符号数的。于是给大家一个错觉:汇编器有两套标准,会区分有符号和无符号,然后分别汇编。其实,你们被骗了。:-)
二、存在两套指令!
第一点说明汇编器只用一个方法把整数字面量汇编成真正的机器数。但并不是说计算机不区分有符号数和无符号数,相反,计算机对有符号和无符号数区分的十分清晰,因为计算机进行某些同样功能的处理时有两套指令作为后备,这就是分别为有符号和无符号数准备的。但是,这里要强调一点,一个数到底是有符号数还是无符号数,计算机并不知道,这是由你来决定的,当你认为你要处理的数是有符号的,那么你就用那一套处理有符号数的指令,当你认为你要处理的数是无符号的,那就用处理无符号数的那一套指令。加减法只有一套指令,因为这一套指令同时适用于有符号和无符号。下面这些指令:mul div movzx … 是处理无符号数的,而这些:imul idiv movsx … 是处理有符号的。
举例来说:
内存里有 一个字节x 为:0x EC ,一个字节 y 为:0x 02 。当把x,y当作有符号数来看时,x = -20 ,y = +2 。当作无符号数看时,x = 236 ,y = 2 。下面进行加运算,用 add 指令,得到的结果为:0x EE ,那么这个 0x EE 当作有符号数就是:-18 ,无符号数就是 238 。所以,add 一个指令可以适用有符号和无符号两种情况。(呵呵,其实为什么要补码啊,就是为了这个呗,:-))
乘法运算就不行了,必须用两套指令,有符号的情况下用imul 得到的结果是:0x FF D8 就是 -40 。无符号的情况下用 mul ,得到:0x 01 D8 就是 472 。(参看文后附录2例程)
三、可爱又可怕的c语言。
为什么又扯到 c 了?因为大多数遇到有符号还是无符号问题的朋友,都是c里面的 signed 和 unsigned 声明引起的,那为什么开头是从汇编讲起呢?因为我们现在用的c编译器,无论gcc 也好,vc6 的cl 也好,都是将c语言代码编译成汇编语言代码,然后再用汇编器汇编成机器码的。搞清楚了汇编,就相当于从根本上明白了c,而且,用机器的思维去考虑问题,必须用汇编。(我一般遇到什么奇怪的c语言的问题都是把它编译成汇编来看。)
C 是可爱的,因为c符合kiss 原则,对机器的抽象程度刚刚好,让我们即提高了思维层面(比汇编的机器层面人性化多了),又不至于离机器太远(像c# ,java之类就太远了)。当初K&R 版的c就是高级一点的汇编……:-)
C又是可怕的,因为它把机器层面的所有的东西都反应了出来,像这个有没有符号的问题就是一例(java就不存在这个问题,因为它被设计成所有的整数都是有符号的)。为了说明它的可怕特举一例:
#include <stdio.h>
#include <string.h>
int main()
{
int x = 2;
char * str = "abcd";
int y = (x - strlen(str) ) / 2;
printf("%d\n",y);
}
结果应该是 -1 但是却得到:2147483647 。为什么?因为strlen的返回值,类型是size_t,也就是unsigned int ,与 int 混合计算时有符号类型被自动转换成了无符号类型,结果自然出乎意料。。。
观察编译后的代码,除法指令为 div ,意味无符号除法。
解决办法就是强制转换,变成 int y = (int)(x - strlen(str) ) / 2; 强制向有符号方向转换(编译器默认正好相反),这样一来,除法指令编译成 idiv 了。
我们知道,就是同样状态的两个内存单位,用有符号处理指令 imul ,idiv 等得到的结果,与用 无符号处理指令mul,div等得到的结果,是截然不同的!所以牵扯到有符号无符号计算的问题,特别是存在讨厌的自动转换时,要倍加小心!(这里自动转换时,无论gcc还是cl都不提示!!!)
为了避免这些错误,建议,凡是在运算的时候,确保你的变量都是 signed 的。
四、c的做法。
对于有符号和无符号的处理上,c语言层面做的更“人性化”一些。比如在声明变量的时候,c 有signed 和 unsigned 前缀来区别,而汇编呢,没有任何区别,把握全在你自己,比如:你想在一个字节中输入一个有符号数,那么这个数就别超过 -128 ~ +127 ,想输入无符号数,要保证数值在 0~255 之间。如果你输入了 236 ,你还要说你输入的是有符号数,那么你肯定错了,因为有符号数236至少要两个字节来存放(为00 EC),不要小看了那一个字节的00,在有符号乘法下,两个字节的00 EC 与 一个字节的EC,在与同样一个数相乘时,得到的结果是截然不同的!!!
我们来看下具体的列子(用vc6的cl编译器生成):
C语言 编译后生产的汇编语言
……
char x;
unsigned char y;
int z;
x = 3;
y = 236;
z = x*y;
…… ……
_x$ = -4
_y$ = -8
_z$ = -12
……
mov BYTE PTR _x$[ebp], 3
mov BYTE PTR _y$[ebp], 236
movsx eax, BYTE PTR _x$[ebp]
mov ecx, DWORD PTR _y$[ebp]
and ecx, 255
imul eax, ecx
mov DWORD PTR _z$[ebp], eax
……
我们看到,在赋值的时候(绿色部分),汇编后与本文第一条论述相同,是否有符号把握全在自己,c比汇编做的更好这一点没有得到体现,这也可以理解,因为c最终要被编译成汇编,汇编没有在变量声明时区分有无符号这一功能,自然,c也没有办法。但既然c提供了signed和unsigned声明,汇编后,肯定有代码体现这一点,表格里的红色部分就是。对有符号数x他进行了符号扩展,对无符号y进行了零扩展。这里为了举例的方便,进行了有符号数和无符号数的混合运算,实际编程中要避免这种情况。
(完)
附录:
1.计算机对有符号整数的表示只采取一套编码方式,不存在正数用原码,负数用补码这用两套编码之说,大多数计算机内部的有符号整数都是用补码,就是说无论正负,这个计算机内部只用补码来编码!!!只不过正数和0的补码跟他原码在形式上相同,负数的补码在形式上与其绝对值的原码取反加一相同。
2. 两套乘法指令结果例程:
;; 程序存储为 x.s
extern printf
global main
section .data
str1: db "%x",0x0d,0x0a,0
n: db 0x02
section .text
main:
xor eax,eax
mov al, 0xec
mul byte [n] ;有符号乘法指令为: imul
push eax
push str1
call printf
add esp,byte 4
ret
编译步骤:
1. nasm -felf x.s
2. gcc x.o
ubuntu7.04 下用nasm和gcc编译通过。结果符合文章所述
</Entry><Entry KeyWord="typedef (2011)" ActionWord=" " Tipo="1" Flag="0">1. 基本解释
typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(strUCt等)。
在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。
至于typedef有什么微妙之处,请你接着看下面对几个问题的具体阐述。
2. typedef &结构的问题
当用下面的代码定义一个结构时,编译器报了一个错误,为什么呢?莫非C语言不允许在结构中包含指向它自己的指针吗?请你先猜想一下,然后看下文说明:
typedef struct tagNode
{
char *pItem;
pNode pNext;
} *pNode;
答案与分析:
1、typedef的最简单使用
typedef long byte_4;
给已知数据类型long起个新名字,叫byte_4。
2、 typedef与结构结合使用
typedef struct tagMyStruct
{
int iNum;
long lLength;
} MyStruct;
这语句实际上完成两个操作:
1) 定义一个新的结构类型
struct tagMyStruct
{
int iNum;
long lLength;
};
分析:tagMyStruct称为“tag”,即“标签”,实际上是一个临时名字,struct 关键字和tagMyStruct一起,构成了这个结构类型,不论是否有typedef,这个结构都存在。
我们可以用struct tagMyStruct varName来定义变量,但要注意,使用tagMyStruct varName来定义变量是不对的,因为struct 和tagMyStruct合在一起才能表示一个结构类型。
2) typedef为这个新的结构起了一个名字,叫MyStruct。
typedef struct tagMyStruct MyStruct;
因此,MyStruct实际上相当于struct tagMyStruct,我们可以使用MyStruct varName来定义变量。
答案与分析
C语言当然允许在结构中包含指向它自己的指针,我们可以在建立链表等数据结构的实现上看到无数这样的例子,上述代码的根本问题在于typedef的应用。
根据我们上面的阐述可以知道:新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识pNode。
解决这个问题的方法有多种:
1)、
typedef struct tagNode
{
char *pItem;
struct tagNode *pNext;
} *pNode;
2)、
typedef struct tagNode *pNode;
struct tagNode
{
char *pItem;
pNode pNext;
};
注意:在这个例子中,你用typedef给一个还未完全声明的类型起新名字。C语言编译器支持这种做法。
3)、规范做法:
struct tagNode
{
char *pItem;
struct tagNode *pNext;
};
typedef struct tagNode *pNode;
3. typedef & #define的问题
有下面两种定义pStr数据类型的方法,两者有什么不同?哪一种更好一点?
typedef char *pStr;
#define pStr char *;
答案与分析:
通常讲,typedef要比#define要好,特别是在有指针的场合。请看例子:
typedef char *pStr1;
#define pStr2 char *;
pStr1 s1, s2;
pStr2 s3, s4;
在上述的变量定义中,s1、s2、s3都被定义为char *,而s4则定义成了char,不是我们所预期的指针变量,根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字。
#define用法例子:
#define f(x) x*x
main( )
{
int a=6,b=2,c;
c=f(a) / f(b);
printf("%d \n",c);
}
以下程序的输出结果是: 36。
因为如此原因,在许多C语言编程规范中提到使用#define定义时,如果定义中包含表达式,必须使用括号,则上述定义应该如下定义才对:
#define f(x) (x*x)
当然,如果你使用typedef就没有这样的问题。
4. typedef & #define的另一例
下面的代码中编译器会报一个错误,你知道是哪个语句错了吗?
typedef char * pStr;
char string[4] = "abc";
const char *p1 = string;
const pStr p2 = string;
p1++;
p2++;
答案与分析:
是p2++出错了。这个问题再一次提醒我们:typedef和#define不同,它不是简单的文本替换。上述代码中const pStr p2并不等于const char * p2。const pStr p2和const long x本质上没有区别,都是对变量进行只读限制,只不过此处变量p2的数据类型是我们自己定义的而不是系统固有类型而已。因此,const pStr p2的含义是:限定数据类型为char *的变量p2为只读,因此p2++错误。
(注:关于const的限定内容问题,在本系列第二篇有详细讲解)。
#define与typedef引申谈
1) #define宏定义有一个特别的长处:可以使用 #ifdef ,#ifndef等来进行逻辑判断,还可以使用#undef来取消定义。
2) typedef也有一个特别的长处:它符合范围规则,使用typedef定义的变量类型其作用范围限制在所定义的函数或者文件内(取决于此变量定义的位置),而宏定义则没有这种特性。
5. typedef & 复杂的变量声明
在编程实践中,尤其是看别人代码的时候,常常会遇到比较复杂的变量声明,使用typedef作简化自有其价值,比如:
下面是三个变量的声明,我想使用typdef分别给它们定义一个别名,请问该如何做?
>1:int *(*a[5])(int, char*);
>2:void (*b[10]) (void (*)());
>3. doube(*)() (*pa)[9];
答案与分析:
对复杂变量建立一个类型别名的方法很简单,你只要在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头就行了。
>1:int *(*a[5])(int, char*);
//pFun是我们建的一个类型别名
typedef int *(*pFun)(int, char*);
//使用定义的新类型来声明对象,等价于int* (*a[5])(int, char*);
pFun a[5];
>2:void (*b[10]) (void (*)());
//首先为上面表达式蓝色部分声明一个新类型
typedef void (*pFunParam)();
//整体声明一个新类型
typedef void (*pFun)(pFunParam);
//使用定义的新类型来声明对象,等价于void (*b[10]) (void (*)());
pFun b[10];
>3. doube(*)() (*pa)[9];
//首先为上面表达式蓝色部分声明一个新类型
typedef double(*pFun)();
//整体声明一个新类型
typedef pFun (*pFunParam)[9];
//使用定义的新类型来声明对象,等价于doube(*)() (*pa)[9];</Entry><Entry KeyWord="replication repair 同步精确(2011)" ActionWord=" " Tipo="1" Flag="0">USE Distribution
GO
SET NOCOUNT ON
DECLARE @command_id int
,@tsn nvarchar(50)
SELECT @command_id = 10
,@tsn = '0x00000AEE00003D8E001100000000'
IF OBJECT_ID('tempdb..#repl') IS NOT NULL
DROP TABLE #repl
CREATE TABLE #repl
( id int
PRIMARY KEY IDENTITY(1,1) NOT NULL
,xact_seno varbinary(16) NULL
,originator_srvname sysname NULL
,originator_db sysname NULL
,article_id int NULL
,type int NULL
,partial_command bit NULL
,hashkey int NULL
,originator_publication_id int NULL
,originator_db_version INT NULL
,originator_lsn varbinary(16) NULL
,command nvarchar(1024)
,command_id int NULL
)
DECLARE @cmd nvarchar(max)
SET @cmd = N'EXEC sp_browsereplcmds N' + QUOTENAME(@tsn,N'''')
+N',N'+ QUOTENAME(@tsn,N'''')
INSERT #repl EXEC (@cmd)
SELECT * FROM #repl
WHERE command_id=@command_id
</Entry><Entry KeyWord="Replication_重建同步(2011)" ActionWord=" " Tipo="1" Flag="0">-- ===========================================================
-- script for :
-- replication list
-- ===========================================================
SET NOCOUNT ON;
DECLARE
@ServerName sysname
;
SET @ServerName = @@SERVERNAME;
DECLARE
@sql nvarchar(max)
;
SET
@sql = N'
;WITH
ART AS(
SELECT
article_id = ART.artid,
publication_id = ART.pubid,
object_id = ART.objid,
article_name = ART.name,
destination_schema = ART.dest_owner,
destination_object = ART.dest_table,
row_filter = ART.filter_clause,
column_filter = CASE
WHEN (
SELECT COUNT(*) FROM sys.columns WITH(NOLOCK)
WHERE object_id = ART.objid
)
= (
SELECT COUNT(*) FROM dbo.sysarticlecolumns WITH(NOLOCK)
WHERE artid = ART.artid
)
THEN 0
ELSE 1
END,
ins_cmd,
upd_cmd,
del_cmd
FROM dbo.sysarticles ART WITH(NOLOCK)
UNION ALL
SELECT
article_id = ARTS.artid,
publication_id = ARTS.pubid,
object_id = ARTS.objid,
article_name = ARTS.name,
destination_schema = ARTS.dest_owner,
destination_object = ARTS.dest_object,
row_filter = NULL,
column_filter = 0,
ins_cmd = NULL,
upd_cmd = NULL,
del_cmd = NULL
FROM dbo.sysschemaarticles ARTS WITH(NOLOCK)
),
REPL AS(
SELECT
ART.article_id,
ART.publication_id,
ART.object_id,
ART.article_name,
ART.destination_schema,
ART.destination_object,
ART.row_filter,
ART.column_filter,
ART.ins_cmd,
ART.upd_cmd,
ART.del_cmd,
publication_name = PUB.name,
destination_server = SUB.srvname,
destination_database = SUB.dest_db
FROM ART
INNER JOIN dbo.syspublications PUB WITH(NOLOCK)
ON ART.publication_id = PUB.pubid
LEFT JOIN dbo.syssubscriptions SUB WITH(NOLOCK)
ON ART.article_id = SUB.artid
AND SUB.srvid <> -1 AND dest_db <> N''virtual'' -- not include virtual replication
-- when publication property @immediate_sync = true, will include virtual replication for each article
),
OBJ AS(
SELECT
OBJ.object_id,
object_type = OBJ.type,
schema_name = SCH.name,
object_name = OBJ.name
FROM sys.objects OBJ WITH(NOLOCK),
sys.schemas SCH WITH(NOLOCK)
WHERE OBJ.schema_id = SCH.schema_id
),
RE AS(
SELECT
publication_name = REPL.publication_name,
article_name = REPL.article_name,
object_type = OBJ.object_type,
publisher_server = @ServerName,
publisher_database = @database_name,
publisher_schema = OBJ.schema_name,
publisher_object = OBJ.object_name,
subscriber_server = REPL.destination_server,
subscriber_database = REPL.destination_database,
subscriber_schema = REPL.destination_schema,
subscriber_object = REPL.destination_object,
row_filter = REPL.row_filter,
column_filter = CONVERT(nvarchar(max),
CASE
WHEN column_filter = 0 THEN NULL
ELSE STUFF(
(
SELECT
N'','' + C.name
FROM sys.columns C WITH(NOLOCK),
dbo.sysarticlecolumns ARTC WITH(NOLOCK)
WHERE C.column_id = ARTC.colid
AND C.object_id = REPL.object_id
AND ARTC.artid = REPL.article_id
FOR XML PATH(''''), TYPE
).value(''/'', ''nvarchar(max)''),
1, 1, N'''')
END),
insert_cmd = CONVERT(nvarchar(255), REPL.ins_cmd),
update_cmd = CONVERT(nvarchar(255), REPL.upd_cmd),
delete_cmd = CONVERT(nvarchar(255), REPL.del_cmd)
FROM REPL, OBJ
WHERE REPL.object_id = OBJ.object_id
)
SELECT
publication_name,
article_name,
object_type,
publisher_server,
publisher_database,
publisher_schema,
publisher_object,
subscriber_server,
subscriber_database,
subscriber_schema,
subscriber_object,
row_filter,
column_filter,
insert_cmd,
update_cmd,
delete_cmd
FROM RE
';
DECLARE @tb_repliation TABLE(
publication_name sysname,
article_name sysname,
object_type char(2),
publisher_server sysname,
publisher_database sysname,
publisher_schema sysname,
publisher_object sysname,
subscriber_server sysname NULL,
subscriber_database sysname NULL,
subscriber_schema sysname NULL,
subscriber_object sysname NULL,
row_filter nvarchar(max),
column_filter nvarchar(max),
insert_cmd nvarchar(255),
update_cmd nvarchar(255),
delete_cmd nvarchar(255)
);
DECLARE
@s nvarchar(max),
@database_name sysname
;
DECLARE CUR_db CURSOR LOCAL FORWARD_ONLY READ_ONLY STATIC
FOR
SELECT
name
FROM sys.databases WITH(NOLOCK)
WHERE is_published = 1
AND state IN(0, 5) --AND name = 'DropShip'
;
OPEN CUR_db;
FETCH CUR_db INTO
@database_name
;
WHILE @@FETCH_STATUS = 0
BEGIN;
SET @s = N'
USE ' + QUOTENAME(@database_name) + N'
' + @sql;
INSERT @tb_repliation
EXEC sp_executesql
@s,
N'
@ServerName sysname,
@database_name sysname
',
@ServerName, @database_name
;
FETCH CUR_db INTO
@database_name
;
END;
CLOSE CUR_db;
DEALLOCATE CUR_db;
WITH
DATA AS(
SELECT
*
FROM @tb_repliation
WHERE subscriber_server IS NOT NULL
),
DB AS(
SELECT DISTINCT
publisher_server, publisher_database
FROM DATA
),
REQ AS(
SELECT DISTINCT
publication_name,
publisher_server,
publisher_database,
publisher_schema,
publisher_object,
publisher = QUOTENAME(publisher_server)
+ N'.' + QUOTENAME(publisher_database)
+ N'.' + QUOTENAME(publisher_schema)
+ N'.' + QUOTENAME(publisher_object),
subscriber_server,
subscriber_database,
subscriber_schema,
subscriber_object,
row_filter,
column_filter,
insert_cmd,
delete_cmd,
update_cmd
FROM DATA --WHERE publisher_database = N'svc2005'
--AND (publisher_object= N'RMAMaster' OR publisher_object= N'RMATransaction' )
)
----SELECT * FROM DB
SELECT
N'
UNION ALL
SELECT
publication_name = ' + ISNULL(N'N' + QUOTENAME(publication_name, N''''), N'NULL') + N',
publisher = N' + QUOTENAME(publisher, N'''') + N',
subscriber_server = N' + QUOTENAME(subscriber_server, N'''') + N',
subscriber_database = N' + QUOTENAME(subscriber_database, N'''') + N',
subscriber_schema = N' + QUOTENAME(subscriber_schema, N'''') + N',
subscriber_object = N' + QUOTENAME(subscriber_object, N'''') + N',
row_filter = ' + ISNULL(N'N''' + REPLACE(row_filter, N'''', N'''''') + N'''', N'NULL') + N',
column_filter = ' + ISNULL(N'N''' + REPLACE(column_filter, N'''', N'''''') + N'''', N'NULL') + N',
insert_cmd = ' + ISNULL(N'N''' + REPLACE(insert_cmd, N'''', N'''''') + N'''', N'NULL') + N',
delete_cmd = ' + ISNULL(N'N''' + REPLACE(delete_cmd, N'''', N'''''') + N'''', N'NULL') + N',
update_cmd = ' + ISNULL(N'N''' + REPLACE(update_cmd, N'''', N'''''') + N'''', N'NULL') + N'
'
FROM REQ
WHERE publication_name= N'Rp_IPP3_E5PORTALDB01.IPP3_02'
;</Entry><Entry KeyWord="查询 fulltext(2011)" ActionWord=" " Tipo="1" Flag="0">
use eCommerce2005
go
select * from sys.fulltext_catalogs
select OBJECT_NAME(object_id),* from sys.fulltext_indexes
--查询fulltext objectname and col
select OBJECT_NAME(ft.object_id),col.name, ft.* from sys.fulltext_index_columns ft
inner join sys.columns col
on ft.object_id=col.object_id
and ft.column_id=col.column_id
</Entry><Entry KeyWord="C++ struct (2011)" ActionWord=" " Tipo="1" Flag="0">node表示一个结构体,结构如下:
{
datatype data;
struct node *next;
}
StackNode的含义和node相同。
*LinkStack表示一个StackNode类型的指针,指向的对象是一个StackNode对象。
举例如下:
int main()
{
node a1;
struct node a2;
StackNode a3;
LinkStack ps;
ps = &a3;
return 0;
}</Entry><Entry KeyWord="c++ 指针(2011)" ActionWord=" " Tipo="1" Flag="0">第一种情况:
int *p;
cout<<p<<endl;
cout<<&p<<endl;
return 0;
结果:编译通过,执行错误。原因:指针p未初始化,野指针,引起内存错误。
第二种情况:
int *p=0; // 指针定义并初始化。注意:这里的不是给p赋值,而是初始化为空指针,等价于NULL。
cout<<p<<endl; // 输出: 。指的是指针p指向的地址,这里为空。
cout<<&p<<endl; // 输出:ff60 。指的是存放指针p的地址。
return 0;
结果:编译通过,执行通过。
第三种情况:
int *p=NULL; // 指针定义并初始化,初始化为空指针。
cout<<p<<endl; // 输出: 。指的是指针p指向的地址,这里为空。
cout<<&p<<endl; // 输出:ff60 。指的是存放指针p的地址。
return 0;
结果:编译通过,执行通过。这种情况等价于第二种情况,一般写为这种,不会引起歧义。
第四种情况:
int *p=1;
cout<<p<<endl;
cout<<&p<<endl;
return 0;
结果:编译不通过。原因:在指针p未分配内存空间的情况下,试图赋值。
第五种情况:
int *p = new int; // 指针定义并初始化,分配内存空间。
*p = 1; // 指针赋值。
cout<<*p<<endl; // 输出: 。指的是指针p指向的地址中存放的数据。
cout<<p<<endl; // 输出:b97e0。指的是指针p指向的内存地址。
cout<<&p<<endl; // 输出:ff60。指的是存放指针p的内存地址。
return 0;
结果:编译通过,执行通过。
</Entry><Entry KeyWord="typedef void (*Fun) (void)指针函数(2011)" ActionWord=" " Tipo="1" Flag="0">为便于理解,你可以这样解释:
typedef void(* Fun)(void) Fun
类似于
typedef int INT
Fun在声明以后,可以把它当作数据类型声明其他变量
Fun的确切意义是一个函数指针类型,该函数没有参数且无返回值
定义了一个int类型的变量i;
而这样
typedef INT int;
表示用户自己定义了一个整型数据类型INT,实际上就等同于int
所以:INT ii;
同上,表示定义了一个int类型的变量ii;
同样的:
void (*pFn)(void)
定义了一个函数指针,该函数指针指向 类似于 void Foo(void)函数的函数入口地址
而这样:
typedef void (*Fun)(void)
表示用户自己定义了一个函数指针数据类型
而
Fun pf;
表示定义了一个函数指针pf,改函数指针指向类似于void Foo(void)的函数 </Entry><Entry KeyWord="智力题(2011)" ActionWord=" " Tipo="1" Flag="0">
1000瓶药水,其中至多有1瓶剧毒,现在给你10只小狗在24小时内通过小狗试药的方式找出哪瓶药有毒或者全部无毒(小狗服完药20小时后才能判断是否中毒)
这道题目太残忍
把狗从0-9编号
把药水按1-1000编号
把药水编号按二进制,如果第i位(因为最大1000,所以bit位为0-9)bit位为1,则分给编号为i的狗狗喝
最后得一二进制数,如果编号为i的狗狗死了,该数的第i bit位为1,该数就是有毒的药水编号
要死多少条狗啊,…</Entry><Entry KeyWord="返回字符串长度strlen(2011)" ActionWord=" " Tipo="1" Flag="0">系统函数:
int strlen (const char * str)
{
int length = 0;
while( *str++ )
++length;
return( length );
}
不用中间变量:
int strlen (const char * str)
{
if(*str) return strlen(++str)+1;
return 0;
}
</Entry><Entry KeyWord="const char* str (2011)" ActionWord=" " Tipo="1" Flag="0">要记住:标准也是在妥协下的产物,标准上允许的不一定是正确的。
我没有读过C++标准,我也从来不是一个标准的拥趸,泛标准论本来就不是什么好事情
不过我相信在这方面我没法说服你,因为你很可能还没有理解软件工业化的许多痛苦,还是很坚持“标准”的。
我们假定标准规定char * a ="abcd"合法,那么标准自己是矛盾的。大家都知道"abcd"不是变量(如果你反驳,我就说什么都白搭),一个常量是不可能有非常量的地址的,而这个表达式的左侧是一个存储非常量地址的指针,标准怎么解释这种矛盾?
我还想说一个事实,char * a= "abcd",依赖编译器的不同,"abcd"放的位置可能是只读存储区,在这种情况下a[2] = 'b'也许不会导致语法错误,但是会导致程序崩溃
如果标准允许你这样写,要么是标准有bug,要么编译器不完全符合标准。然而在实际生产中,是否符合标准不是最重要的,程序不崩溃才是最重要的,因此如果编译器不支持标准某个特殊规定,那么标准就不能使用。</Entry><Entry KeyWord="replication 查找 articles(2011)" ActionWord=" " Tipo="1" Flag="0">
use distribution
go
select pub.publication,pub.publisher_db,art.article from dbo.MSpublications pub WITH (NOLOCK)
inner join dbo.MSarticles art WITH (NOLOCK)
on pub.publication_id=art.publication_id
where
publication like '%Rp_CUSTOMER_NEWSQL2.DATACACHE_01%'
</Entry><Entry KeyWord="&lt;winsock2.h&gt;与&lt;windows.h&gt; (2011)" ActionWord=" " Tipo="1" Flag="0">有关同时包含<winsock2.h>与<windows.h>头文件的问题
推荐
最近发现winsock2.h头文件与windows.h头文件在同时包含的时候会有问题,编译时会产生很多类型重复定义的错误。分析一下 winsock.h、winsock2.h和windows.h三个头文件,可以发现:要解决这个问题,需要首先包含winsock2.h,然后再包括 windows.h,要注意包含的顺序。
在Windows.h中,包含了winsock.h(winsock.h支持socket 1.1)。因此首先包含windows.h,然后再包含winsock2.h,显然会出现问题。</Entry><Entry KeyWord="#pragma comment(lib, &quot;Ws2_32.lib &quot;) (2011)" ActionWord=" " Tipo="1" Flag="0">#pragma comment 的用法实在是太多了,可以告诉你的是
#pragma comment(lib, "Ws2_32.lib ")表示链接Ws2_32.lib这个库。
和在工程设置里写上链入Ws2_32.lib的效果一样,不过这种方法写的
程序别人在使用你的代码的时候就不用再设置工程settings了。</Entry><Entry KeyWord="socket send (2011)" ActionWord=" " Tipo="1" Flag="0">#include "stdafx.h"
#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#pragma comment(lib, "WS2_32.lib")
#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT 27015
int main() {
//----------------------
// Declare and initialize variables.
int iResult;
WSADATA wsaData;
SOCKET ConnectSocket;
struct sockaddr_in clientService;
int recvbuflen = DEFAULT_BUFLEN;
char *sendbuf = "Client: sending data test";
char recvbuf[DEFAULT_BUFLEN] = "";
//----------------------
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR) {
printf("WSAStartup failed with error: %d\n", iResult);
return 1;
}
//----------------------
// Create a SOCKET for connecting to server
ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ConnectSocket == INVALID_SOCKET) {
printf("socket failed with error: %ld\n", WSAGetLastError());
WSACleanup();
return 1;
}
//----------------------
// The sockaddr_in structure specifies the address family,
// IP address, and port of the server to be connected to.
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );
clientService.sin_port = htons( DEFAULT_PORT );
//----------------------
// Connect to server.
iResult = connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) );
if (iResult == SOCKET_ERROR) {
printf( "connect failed with error: %d\n", WSAGetLastError() );
closesocket(ConnectSocket);
WSACleanup();
return 1;
}
//----------------------
// Send an initial buffer
iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );
if (iResult == SOCKET_ERROR) {
printf("send() failed with error: %d\n", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
return 1;
}
printf("Bytes Sent: %d\n", iResult);
// shutdown the connection since no more data will be sent
iResult = shutdown(ConnectSocket, SD_SEND);
if (iResult == SOCKET_ERROR) {
printf("shutdown failed with error: %d\n", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
return 1;
}
// Receive until the peer closes the connection
do {
iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
if ( iResult > 0 )
printf("Bytes received: %d\n", iResult);
else if ( iResult == 0 )
printf("Connection closed\n");
else
printf("recv failed with error: %d\n", WSAGetLastError());
} while( iResult > 0 );
// cleanup
closesocket(ConnectSocket);
WSACleanup();
return 0;
}
</Entry><Entry KeyWord="随机查询一条数据newid(2011)" ActionWord=" " Tipo="1" Flag="0">select IPADDRESS,ShippingAddress1, ShippingState,ShippingZipCode,ShippingCity, bBillingCity,bBillingAddress1,bBillingZipCode,bBillingState from NHISSLS.dbo.View3YN_SOMaster with(nolock) where sonumber = (SELECT top 1 sonumber from NHISSLS.dbo.View3YN_SOMaster with(nolock) order by newid())
</Entry><Entry KeyWord="resource view Opened in another editor (2011)" ActionWord=" " Tipo="1" Flag="0">VC2005 无法打开Resource View.提示Opened in another editor ?????
今天我也遇到了这个问题,在网上搜索了很多,说得都不是很清楚。最后还是我自己解决问题的。
方法是:打开VC2005,然后在工程编辑器(那个最主要的我们编写代码的窗口)把所有打开的文件关闭,让它变成一个空窗口。
然后再去点击RESOURCE VIEW的树状图。它就可以打开了。</Entry><Entry KeyWord="user deny 权限(2011)" ActionWord=" " Tipo="1" Flag="0">
use @@database
declare @purview varchar(200)
declare @tableName varchar(200)
set @tableName='dbo.arinvt01'
set @purview=' delete ,insert,alter '
set nocount on
create table #RoleMember
(DBRole varchar(100),
MemberName varchar(100),
MemberSid varbinary(2048))
insert into #RoleMember
exec sp_helprolemember
select DBRole,MemberName from #RoleMember
where DBRole not like '%msrepl%'
and MemberName not in ('CDDBA','dbo','MonDbo','RepDbo')
declare @Sql varchar(8000)
set @Sql='use '+db_name() +CHAR(10)+CHAR(10)
declare @memberName varchar(200)
DECLARE DATA_CURSOR CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
select MemberName from #RoleMember
where DBRole not like '%msrepl%'
and MemberName not in ('CDDBA','dbo','MonDbo','RepDbo')
OPEN DATA_CURSOR
FETCH NEXT FROM DATA_CURSOR INTO @memberName
WHILE @@FETCH_STATUS = 0
BEGIN
set @Sql+='deny '+@purview+' on OBJECT::'+@tableName+' to '+@memberName+CHAR(10)
FETCH NEXT FROM DATA_CURSOR INTO @memberName
end
CLOSE DATA_CURSOR
DEALLOCATE DATA_CURSOR
drop table #RoleMember
print @sql
--exec sp_helprolemember</Entry><Entry KeyWord="SetWindowRedraw(2011)" ActionWord=" " Tipo="1" Flag="0">Speeding up adding items to a combobox or listbox
Just a little tip: If you're going to be adding a lot of items to a listbox or combobox, there are a few little things you can do to improve the performance significantly. (Note: The improvements work only if you have a lot of items, like hundreds. Of course, the usability of a listbox with a hundred items is questionable, but I'm assuming you have a really good reason for doing this.)
First, you can disable redraw while you add the items. (This tip works for all controls, actually.)
SetWindowRedraw(hwnd, FALSE);
... add the items ...
SetWindowRedraw(hwnd, TRUE);
InvalidateRect(hwnd, NULL, TRUE);</Entry><Entry KeyWord="combobox (2011)" ActionWord=" " Tipo="1" Flag="0">
void Ctest22Dlg::OnBnClickedOk()
{
m_listBox1.AddString("1");
m_listBox1.AddString("2");
m_listBox1.AddString("3");
//设置下拉框宽度,图形界面设置下拉框高度
m_listBox1.SetDroppedWidth(100);
//m_listBox1.Set(100);
int nCount = m_listBox1.GetCount();
CString strText(_T(""));
for(int i=0; i<nCount; i++)
{
m_listBox1.GetLBText(i, strText);
m_listBox2.AddString(strText);
}
CComboBox *cbb;
cbb=&m_listBox1;
SetDropDownHeight(cbb,2);
}
//程序设置下拉框高度
void SetDropDownHeight(CComboBox* pMyComboBox, int itemsToShow)
{
//Get rectangles
CRect rctComboBox, rctDropDown;
pMyComboBox->GetClientRect(&rctComboBox); //Combo rect
pMyComboBox->GetDroppedControlRect(&rctDropDown); //DropDownList rect
int itemHeight = pMyComboBox->GetItemHeight(-1); //Get Item height
pMyComboBox->GetParent()->ScreenToClient(&rctDropDown); //Converts coordinates
rctDropDown.bottom = rctDropDown.top + rctComboBox.Height() + itemHeight*itemsToShow; //Set height
pMyComboBox->MoveWindow(&rctDropDown); //enable changes
}</Entry><Entry KeyWord="c++ 读文件 read file(2011)" ActionWord=" " Tipo="1" Flag="0">
void Ctest22Dlg::OnBnClickedCancel22()
{
StdioFile file;
file.Open("C:\\Temp\\123.txt",CFile::modeRead);
CString strLine(_T(""));
CString strText(_T(""));
int k=file.GetLength();
while(file.ReadString(strLine))
{
strText += strLine + _T("\r\n");
}
file.Close();
}
</Entry><Entry KeyWord="C++ JMP $+2 延时(2011)" ActionWord=" " Tipo="1" Flag="0">JMP 这个指令是占2个字节的吧,$+2就是当前指令的下一个指令,上网上搜了一些,JMP $+2主要用在端口出入输出上面,主要是延迟的功能给外设反映的时间,也就是延迟了一个指令的执行,但是不太好用,谢谢各位~~~!!</Entry><Entry KeyWord="linux 常用命令(2011)" ActionWord=" " Tipo="1" Flag="0">1.vi 建立文件
保存文件
如果是用vi编辑的话,在Insert状态下先按ESC,再输入冒号(:),再输入wq(保存退出)就可以了
2.clear 清屏
3.useradd 添加用户
passwd username 设置密码
userdel username 删除用户
groupadd groupname 添加组
groupdel 删除组
4.mkdir dir 创建目录
rmdir dir 删除目录
pwd 显示工作目录
ls -a 显示所有文件包括.开头文件
ls -l 以长列表显示
5.
cd 进入登陆目录
cd / 进入根目录
cd .. 上一级目录
cd /home 进入系统的home目录
cd home 进入当前目录下home目录
mv dirold dirnew 重命名目录
cp sourceDir targetDir 拷贝目录
6.
vi filename & touch filename 创建文件
rm filename 删除文件
mv sourFile TargetFile 重命名文件
cp sourFile targetFile 拷贝文件
ln -s sourceFile TargetFile 创建文件链接
7.
more FileName 一次显示一屏文件内容
cat FileName 一次显示全部文件内容
cat file1 file2>file3 将file1和file2内容写到file3中,覆盖
cat file1>>file2 将file1的内容追加到file2
grep "123" test.txt 在test文件中查找字符串“”
8.文件类型
- 普通文件
| link文件
d 目录
p 命名管道文件
b 块设备文件
9.
文件权限rwx(u(user 文件的属主),g(group 文件的属主的组),o(other 其他用户))
chmod a-x 123.txt (收回所有用户执行权限)
chmod go+w 123.txt (赋予组用户和其他用户的写权限)
chmod a= 123.txt (清除所有权限)
chmod 666 123.txt (赋予所有用户读写的权限)
10.
chown yind 123.txt 改变文件或目录的属主
chgrp grp 123.txt 改文件或目录的属组
chown yind:grp 123.txt 改变文件的属主和属组</Entry><Entry KeyWord="trigger (2011)监控表数据变化" ActionWord=" " Tipo="1" Flag="0">
-- trigger sample
ALTER TRIGGER [dbo].[TR_All_Monitor_Newegg_SoMaster]
ON [dbo].[NewEgg_SOMaster]
FOR UPDATE, INSERT, DELETE
AS
SET NOCOUNT ON;
INSERT dbo._MarkDelete_20090728_So(
event_type, parameter, sql)
EXEC(N'DBCC INPUTBUFFER(@@SPID)');
</Entry><Entry KeyWord="hosts文件(2011)" ActionWord=" " Tipo="1" Flag="0">
C:\WINDOWS\system32\drivers\etc</Entry><Entry KeyWord="xml * 的用法与unicode(2011)" ActionWord=" " Tipo="1" Flag="0">
declare @xml xml
--------------------生成xml-----------
;WITH XMLNAMESPACES(DEFAULT 'http://www.mysuhect.com/namespace')
select @xml=
(
SELECT
'MySubject' AS "Subject"
,'http://www.mysuhect.com/FromService' AS "FromService"
,'http://www.mysuhect.com/ToService' AS "ToService"
,[Node] =
(SELECT 'AddItem' AS "Action"
,'cc' AS "Comment"
,'NESO' AS "Sender"
,'EN' AS "Languag"
,'联想' AS "CompanyCode"
,'1.0' AS "Version"
FOR XML PATH('Message'),TYPE
)
,[Node] =
(SELECT 'DeleteItem' AS "Action"
,'tttttt' AS "Comment"
,'NESO' AS "Sender"
,'EN' AS "Languag"
,N'联想' AS "CompanyCode"
,'1.0' AS "Version"
FOR XML PATH('Message'),TYPE
)
FOR XML PATH ('MyProject'),TYPE
)
--select @xml as 生成
;WITH XMLNAMESPACES(DEFAULT 'http://www.mysuhect.com/namespace')
sELECT T.c.query(N'(./Message/*)')
FROM @xml.nodes('/MyProject/Node') T(c)
;WITH XMLNAMESPACES(DEFAULT 'http://www.mysuhect.com/namespace')
sELECT T.c.query(N'(./Message)')
FROM @xml.nodes('/MyProject/Node') T(c)
</Entry><Entry KeyWord="xml replace insert 空节点(2011)" ActionWord=" " Tipo="1" Flag="0">
declare @xml xml
set @xml = '<root><test></test></root>'
--replace 不能替换空节点
set @xml.modify('replace value of (/root/test/text())[1] with "testnew value"')
select @xml
-- 如果节点为空,插入
set @xml.modify('insert text{ "test new value"} into (/root/test[not(text())])[1]')
select @xml
---replace 可以替换空节点
set @xml.modify('replace value of (/root/test/text())[1] with "replace new value"')
select @xml
set @xml.modify('insert text{ "test new value"} into (/root/test[not(text())])[1]')
select @xml</Entry><Entry KeyWord="index 碎片查询(2011)" ActionWord=" " Tipo="1" Flag="0">USE ItemMaintain;
GO
SELECT * FROM sys.dm_db_index_physical_stats
(DB_ID(N'ItemMaintain'), OBJECT_ID(N'InventoryTransaction'), NULL, NULL , null);
GO
</Entry><Entry KeyWord="user 用户有的权限(2011)" ActionWord=" " Tipo="1" Flag="0">select object_name(id) obj,
(case [action] when 26 then 'REFERENCES'
when 178 then 'CREATE FUNCTION'
when 193 then 'SELECT'
when 195 then 'INSERT'
when 196 then 'DELETE'
when 197 then 'UPDATE'
when 198 then 'CREATE TABLE'
when 203 then 'CREATE DATABASE'
when 207 then 'CREATE VIEW'
when 222 then 'CREATE PROCEDURE'
when 224 then 'EXECUTE'
when 228 then 'BACKUP DATABASE'
when 233 then 'CREATE DEFAULT'
when 235 then 'BACKUP LOG'
when 236 then 'CREATE RULE' end) perm
from sysprotects where [uid]=user_id()</Entry><Entry KeyWord="Saving changes is not permitted 不能保存(2011)" ActionWord=" " Tipo="1" Flag="0">
This dialog states: "Saving changes is not permitted.
The changes you have made require the following tables to be dropped and re-created.
You have either made changes to a table that can't be re-created or enabled the option
Prevent saving changes that require the table to be re-created."
So what you want to do to configure the setting with the value you want (IMHO should be the default setting!).
Go to: Tools > Options
Select the tab Designers and choose Tables and designers
And uncheck the option: "Prevent saving changes that require table re-creation".
Once you now save changes it will work.
</Entry><Entry KeyWord="errorlog(2011)" ActionWord=" " Tipo="1" Flag="0">1. On the Start menu, point to All Programs, point to Microsoft SQL Server 2005, point to Configuration Tools, and then click SQL Server Configuration Manager.
2. In SQL Server Configuration Manager, expand Services, and then click SQL Server
3. In the details pane, right-click the name of the instance you want to start automatically, and then click Properties
4. Click the Advanced tab, and Verify Startup Parameters. </Entry><Entry KeyWord="TRANSACTION ISOLATION LEVEL (2011)" ActionWord=" " Tipo="1" Flag="0">
READ UNCOMMITTED 脏读
READ COMMITTED 提交读
REPEATABLE READ 重复读(其他事务不能update数据,当前选择的数据)
SERIALIZABLE 串行读(其他事务,不能insert当前查询条件的数据)
SNAPSHOT 保持数据一致(不影响其他事务提交修改。)
USE TEST;
GO
--SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
--SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
--SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
---可重复读隔离级别
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN TRANSACTION;
SELECT *
FROM tb where id<10;
COMMIT TRANSACTION;
GO
----第个线程
---处于阻塞状态
use TEST
go
update tb set name='sss' where id=3
</Entry><Entry KeyWord="xml local-name()(2011)" ActionWord=" " Tipo="1" Flag="0">
declare @message xml
set @message=
'
<Publish xmlns="http://soa.newegg.com/SOA/USA/InfrastructureService/V10/PubSubService">
<Subject>MySubject</Subject>
<FromService>http://www.mysuhect.com/FromService</FromService>
<ToService>http://www.mysuhect.com/ToService</ToService>
<Node>
<Action>AddItem</Action>
<Case>222222</Case>
<Body>
<ScanSerialNumber Action="ddddd"><tt>bbcc</tt></ScanSerialNumber>
<ScanSerialNumber Action="ADD1"><tt>cc</tt></ScanSerialNumber>
<Sender>NESO</Sender>
<Languag>EN</Languag>
<CompanyCode>联想</CompanyCode>
</Body>
</Node>
</Publish>
'
SELECT @Message.query('
declare default element namespace "http://soa.newegg.com/SOA/USA/InfrastructureService/V10/PubSubService";
<Publish>
{/Publish/*[local-name()!="Node"]}
</Publish>
')
SELECT @Message.query('
declare default element namespace "http://soa.newegg.com/SOA/USA/InfrastructureService/V10/PubSubService";
<Publish>
{/Publish/*[local-name()!="Node"]}
<Node>
{/Publish/Node/*[local-name()!="Body"]}
</Node>
</Publish>
') </Entry><Entry KeyWord="CURSOR 多次申明(2011)" ActionWord=" " Tipo="1" Flag="0">USE paymentcenter
GO
/*==========================================================
Server: PMCSQL
DataBase: PaymentCenter
Author: caff
ProcName: dbo.Up_PMT_PMC_ForJob_TransferPaymentTransaction
Version: 1.00
Date: 20070618
Content: Transfer to history
* Parameters
* --------------------------------------------------------
* Input : N/A
*
* Output : N/A
*
*
* Table Used :
* ---------------------------------------------------------
*
-----------------------------------------------------------
Modified history:
Date Modified by VER Description
------------------------------------------------------------
20070618 caff 1.00 create
20080912 jamebo 1.01 alter
20081227 thomas 1.02 alter(add ingrian column)
20100121 Zorro 1.03 save more information in transaction view
==========================================================*/
ALTER PROCEDURE dbo.Up_PMT_PMC_ForJob_TransferPaymentTransaction
@MaxTransactionId BIGINT
,@TransferCount INT
AS
BEGIN
SET XACT_ABORT ON
SET NOCOUNT ON
DECLARE @TransactionId BIGINT
DECLARE @Today DATETIME
SET @Today = CONVERT(DATETIME, CONVERT(CHAR(10), GETDATE(), 102))
IF @TransferCount > 0
BEGIN
IF @MaxTransactionId > 0
BEGIN
DECLARE data_cursor CURSOR
LOCAL
FORWARD_ONLY
STATIC
READ_ONLY
FOR
SELECT TOP
(@TransferCount) TransactionId
FROM dbo.PaymentTransaction WITH(NOLOCK)
WHERE
TransactionId < @MaxTransactionId
END ELSE BEGIN
DECLARE data_cursor CURSOR
LOCAL
FORWARD_ONLY
STATIC
READ_ONLY
FOR
SELECT TOP
(@TransferCount) TransactionId
FROM dbo.PaymentTransaction WITH(NOLOCK)
WHERE
InDate < @Today-40
END
END ELSE BEGIN
IF @MaxTransactionId > 0
BEGIN
DECLARE data_cursor CURSOR
LOCAL
FORWARD_ONLY
STATIC
READ_ONLY
FOR
SELECT
TransactionId
FROM dbo.PaymentTransaction WITH(NOLOCK)
WHERE
TransactionId < @MaxTransactionId
END ELSE BEGIN
DECLARE data_cursor CURSOR
LOCAL
FORWARD_ONLY
STATIC
READ_ONLY
FOR
SELECT
TransactionId
FROM dbo.PaymentTransaction WITH(NOLOCK)
WHERE
InDate < @Today-40
END
END
OPEN data_cursor
FETCH NEXT FROM data_cursor INTO @TransactionId
WHILE @@FETCH_STATUS = 0
BEGIN
IF EXISTS(
SELECT
TransactionId
FROM dbo.V_PaymentTransactionHistory WITH(NOLOCK)
WHERE
TransactionId = @TransactionId
)
BEGIN
DELETE
FROM dbo.PaymentTransaction
WHERE
TransactionId = @TransactionId
END
ELSE
BEGIN
BEGIN TRANSACTION
INSERT dbo.V_PaymentTransactionHistory
(
[TransactionId]
,[CombinedIdentity]
,[LocalMerchantId]
,[MerchantId]
,[DivisionNumber]
,[MerchantOrderNumber]
,[AccountNumberMasked]
,[AccountNumberEncrypted]
,[CvNumberEncrypted]
,[ExpireDate]
,[Amount]
,[Currency]
,[CardType]
,[SettleType]
,[SettledAmount]
,[Status]
,[InDate]
,[CreateDate]
,[AuthorizedDate]
,[LastRequestDate]
,[LastSettleDate]
,[VoidedDate]
,[Expired]
,[CurrencyISOCode]
,IngrianCardNumber
,HashCardNumber
,GatewayReasonCode
,GatewayApproveDate
,GatewayApproveCode
,GatewayAVSCode
,GatewayCAVVCode
,GatewayCVV2Code
,MappedRefNumber
,MerchantCustomerNumber
,MerchantOrderNumber2
,RefundAmount
,AvsCode
)
SELECT
[TransactionId]
,RTRIM([CombinedIdentity])
,RTRIM([LocalMerchantId])
,RTRIM([MerchantId])
,RTRIM([DivisionNumber])
,RTRIM([MerchantOrderNumber])
,RTRIM([AccountNumberMasked])
,RTRIM([AccountNumberEncrypted])
,RTRIM([CvNumberEncrypted])
,RTRIM([ExpireDate])
,[Amount]
,RTRIM([Currency])
,RTRIM([CardType])
,[SettleType]
,[SettledAmount]
,[Status]
,[InDate]
,[CreateDate]
,[AuthorizedDate]
,[LastRequestDate]
,[LastSettleDate]
,[VoidedDate]
,[Expired]
,[CurrencyISOCode]
,IngrianCardNumber
,HashCardNumber
,GatewayReasonCode
,GatewayApproveDate
,GatewayApproveCode
,GatewayAVSCode
,GatewayCAVVCode
,GatewayCVV2Code
,MappedRefNumber
,MerchantCustomerNumber
,MerchantOrderNumber2
,RefundAmount
,AvsCode
FROM [dbo].[PaymentTransaction] WITH(NOLOCK)
WHERE
TransactionId = @TransactionId
DELETE
FROM dbo.PaymentTransaction
WHERE
TransactionId = @TransactionId
COMMIT TRANSACTION
END
FETCH NEXT FROM data_cursor INTO @TransactionId
END
CLOSE data_cursor
DEALLOCATE data_cursor
END
GO</Entry><Entry KeyWord="primary key 查找主键列(2011)" ActionWord=" " Tipo="1" Flag="0">
sp_pkeys EDI832</Entry><Entry KeyWord="replication 修复数据(2011)" ActionWord=" " Tipo="1" Flag="0">--{CALL [dbo].[sp_MSupd_dboItemDescription] (,,,,,'<LongDescription Name="Detailed Specifications"><Group GroupName="Spec"><Property Key="Version" Value="General"/><Property Key="Operating Systems Supported" Value="Mac OS"/></Group></LongDescription>',2011-04-01 02:03:31.150,,,,,,,,,,,,,,NULL,,,,,,,,
--'00X-000A-00001 ',0x60001000)}
use distribution
go
exec sp_browsereplcmds '0x0000070300001D0A001500000000','0x0000070300001D0A001500000000'
go
declare @SourceServer nvarchar(255)
declare @SourceDB nvarchar(255)
declare @article nvarchar(255)
declare @TargetServer nvarchar(255)
declare @targetDB nvarchar(255)
set @TargetServer='s5rmadb01'
set @targetDB=''
set @SourceServer=''
set @SourceDB='codecenter'
set @article='ItemDescription'
set nocount on
if isnull(@targetDB,'')=''
set @targetDB=@SourceDB
if object_id('tempdb.dbo.#t') is not null
drop table #t
create table #t(tb_database nvarchar(255),
tb_owner nvarchar(255),tb_name nvarchar(255),
colname nvarchar(255),keyID int,
pk_name nvarchar(255))
declare @sql nvarchar(max)
set @sql=
N'use '+ @SourceDB +'
insert into #t
exec sp_pkeys '+@article +'
select * from #t
'
exec (@sql)
declare @filter nvarchar(200)
set @sql='use '+@SourceDB+CHAR(10)+
'select @filter=isnull(''and S.''+ convert(nvarchar(4000),art.filter_clause) ,'''')from dbo.sysarticles art
inner join dbo.syssubscriptions sub
on sub.artid=art.artid
where charindex('''+@TargetServer+''', srvname)>0
and art.name='''+@article+''''
--print @sql
exec sp_executesql @sql,N'@filter nvarchar(200) output',@filter=@filter output
--select @filter
--select * from #t
declare @conditon nvarchar(500)
set @conditon=stuff((select 'and S.'+colname+'=T.'+colname+' ' from #t for xml path('')),1,3,'')
declare @conditonIn nvarchar(500)
set @conditonIn=stuff((select 'and S.'+colname+'= ' from #t for xml path('')),1,3,'')
if(isnull(@TargetServer,'')<>'')
set @SourceServer=null
else
set @TargetServer=null
set @sql=
N'
--------need insert or delete data
insert into '+isnull(@TargetServer+'.','')+@targetDB+'.dbo.'+@article++CHAR(10)+
'select * from '+isnull(@SourceServer+'.','')+@SourceDB+'.dbo.'+@article+' S'+
CHAR(10)+'where '+@conditonIn+''+CHAR(10)+CHAR(10)+CHAR(10)+CHAR(10)
print @sql
set @sql=
N'
-----data different
select COUNT(*) from '+isnull(@SourceServer+'.','')+@SourceDB+'.dbo.'+@article+' S '+
'where (1=1 '+@filter+' ) and not exists
(
select * from '+isnull(@TargetServer+'.','')+@targetDB+'.dbo.'+@article+' T '+
'where '+@conditon+CHAR(10)+
')'+CHAR(10)+CHAR(10)+CHAR(10)+CHAR(10)
print @sql
set @sql=
N'
----insert into data
while 1=1
begin
insert into '+isnull(@TargetServer+'.','')+@targetDB+'.dbo.'+@article+CHAR(10)+
'select top 500 * from '+isnull(@SourceServer+'.','')+@SourceDB+'.dbo.'+@article+' S '+
'where (1=1 '+@filter+' ) and not exists
(
select * from '+isnull(@TargetServer+'.','')+@targetDB+'.dbo.'+@article+' T '+
'where '+@conditon+CHAR(10)+
')
if @@rowcount<500
break;
waitfor delay ''00:00:01''
end
'
print @sql
</Entry><Entry KeyWord="grant 授权用户对所有库的访问权限(2011)" ActionWord=" " Tipo="1" Flag="0">use master
go
set nocount on
declare @user_name sysname
,@password nvarchar(12)
select @user_name='tess'
,@password=N'123'
declare @database_Name sysname
,@sql nvarchar(max)
set @sql=N'if not exists(select top 1 1 from sys.syslogins with (nolock)
where name='''+@user_name+''')'+char(10)
+'create login '+@user_name+' with password='''+@password+''''+',CHECK_POLICY = OFF'+CHAR(10)
print @sql
--exec sp_executesql @sql
DECLARE Cur_dbName CURSOR LOCAL STATIC FORWARD_ONLY READ_ONLY
FOR
select name
from sys.sysdatabases with (nolock)
where name not in ('master','msdb','tempdb','model','distribution','SSB')
and status&512<>512--判断数据的状态为OffLine
OPEN Cur_dbName
FETCH NEXT FROM Cur_dbName INTO @database_Name
WHILE @@FETCH_STATUS=0
begin
set @sql=N''+CHAR(10)
set @sql=N'use '+@database_Name+'------数据库---------'+char(10)--+N'GO'+char(10)
+N'if exists (select top 1 1
from sys.sysusers with(nolock)
where name='''+@user_name+''')'+char(10)
+N'begin'+char(10)
+N'exec sp_change_users_login ''Update_One'','''+@user_name+''','''+@user_name+''''+char(10)
+N'end'+char(10)
+N'else'+char(10)
+N'begin'+char(10)
+N'create user '+@user_name+' for login '+@user_name+char(10)
+N'end'+char(10)
--+N'exec sp_addrolemember ''db_datareader'','+' '''+@user_name+''''+char(10)
+N'grant SELECT to '+@user_name++char(10)+char(10)
print @sql
--exec sp_executesql @sql
FETCH NEXT FROM Cur_dbName INTO @database_Name
end
CLOSE Cur_dbName
DEALLOCATE Cur_dbName
</Entry><Entry KeyWord="qurey replication_v2(2011)" ActionWord=" " Tipo="1" Flag="0">use distribution
go
select *,(select drop_publication as [*] FOR XML PATH ('root'),TYPE ) from
(
select p.publication, a.publisher_db,a.source_object,
ss.name,s.subscriber_db--,a.destination_object
,CHAR(10)+CHAR(10)+
'use '+p.publisher_db+CHAR(10)+' go'+CHAR(10)+
'EXEC sp_Dropsubscription @publication = N'''+p.publication+''''+CHAR(10)+
',@subscriber = N'''+ss.name+''''+CHAR(10)+
',@destination_db = N'''+Subscriber_DB+''''+CHAR(10)+
',@article = N'''+a.article+''''+CHAR(10)+
'EXEC sp_DropArticle @publication = N'''+p.publication+''''+CHAR(10)+
',@article = N'''+a.article+''''+CHAR(10)+CHAR(10)
as drop_publication
from dbo.MSsubscriptions s
inner join dbo.MSarticles a
on s.article_id=a.article_id and
s.publication_id=a.publication_id
inner join dbo.MSpublications p
on s.publication_id=p.publication_id
inner join sys.servers ss
on s.subscriber_id=ss.server_id
where
a.article='EC_VideoMaster'
)c
</Entry><Entry KeyWord="left join与inner join(2011)" ActionWord=" " Tipo="1" Flag="0">
---bydba 1,left join 1 和left join 2的结果不同,2和表达式相同
----(1)
select COUNT(*)
from Ecommerce2005.dbo.EDI_Seller_BasicInfo a WITH(NOLOCK)
left join Ecommerce2005.dbo.EDI_Seller_BasicInfo b WITH(NOLOCK)
on a.sellerid=b.sellerid
and b.shiptype=a.shiptype
and b.shiptype=2
----(2)
select COUNT(*)
from Ecommerce2005.dbo.EDI_Seller_BasicInfo a WITH(NOLOCK)
left join Ecommerce2005.dbo.EDI_Seller_BasicInfo b WITH(NOLOCK)
on a.sellerid=b.sellerid
and b.shiptype=a.shiptype
where b.shiptype=2
----(3)
select COUNT(*)
from Ecommerce2005.dbo.EDI_Seller_BasicInfo a WITH(NOLOCK)
inner join Ecommerce2005.dbo.EDI_Seller_BasicInfo b WITH(NOLOCK)
on a.sellerid=b.sellerid
and b.shiptype=a.shiptype
and b.shiptype=2</Entry><Entry KeyWord="miss index (2011)" ActionWord=" " Tipo="1" Flag="0">
SELECT TOP 10 *
FROM sys.dm_db_missing_index_group_stats
ORDER BY avg_total_user_cost * avg_user_impact * (user_seeks + user_scans)DESC;
SELECT migs.group_handle, mid.*
FROM sys.dm_db_missing_index_group_stats AS migs
INNER JOIN sys.dm_db_missing_index_groups AS mig
ON (migs.group_handle = mig.index_group_handle)
INNER JOIN sys.dm_db_missing_index_details AS mid
ON (mig.index_handle = mid.index_handle)
WHERE migs.group_handle = 1814;
</Entry><Entry KeyWord="job schedule enable&amp;disable(2011)" ActionWord=" " Tipo="1" Flag="0">DECLARE @job_name sysname
;
SET @job_name=N'Job_ItemMaintainNewegg_es.UP_EC_Batch_ImportData_Koala'
;
WITH JOB
AS
(
SELECT J.*,S.schedule_id
FROM msdb.dbo.sysjobs J WITH (NOLOCK)
,msdb.dbo.sysjobschedules S WITH (NOLOCK)
WHERE J.job_id=S.job_id
AND J.name=@job_name
)
,SCH
AS
(
SELECT job_sch_enable=
CASE S.enabled WHEN 0
THEN N'disable'
WHEN 1
THEN N'enable'
END
,JOB.*
FROM JOB,msdb.dbo.sysschedules S WITH (NOLOCK)
WHERE JOB.schedule_id=S.schedule_id
)
SELECT * FROM SCH
</Entry><Entry KeyWord="sp_configure 重新配置(2011)" ActionWord=" " Tipo="1" Flag="0">
exec sp_configure 'allow updates', 0;
reconfigure;
EXEC sp_configure 'max text repl size', 2147483647;
RECONFIGURE
</Entry><Entry KeyWord="rebuild index(2011)" ActionWord=" " Tipo="1" Flag="0">USE [master]
GO
/****** Object: StoredProcedure [dbo].[SP_DBAAutoIndex] Script Date: 03/26/2011 17:07:33 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[SP_DBAAutoIndex]
@database_name_list [nvarchar](max) = N'',
@table_name_list [nvarchar](max) = NULL
WITH EXECUTE AS CALLER
AS
SET NOCOUNT ON
--DECLARE
-- @database_name_list nvarchar(max),
-- @table_name_list nvarchar(max)
--SELECT
-- @database_name_list = N'dbaworker',
-- @table_name_list = NULL
SET NOCOUNT ON
BEGIN TRY
-- =================================================
-- prepare parameters
-- =================================================
DECLARE
@flag_edition int,
@flag_all_database bit,
@flag_all_table bit
SELECT
@database_name_list = CASE
WHEN @database_name_list = N'' THEN DB_NAME()
ELSE @database_name_list END,
@flag_edition = CASE
WHEN CONVERT(sysname, SERVERPROPERTY(N'Edition')) LIKE N'Enterprise%' THEN 1
ELSE 0
END,
@flag_all_database = CASE
WHEN @database_name_list > N'' THEN 0
ELSE 1 END,
@flag_all_table = CASE
WHEN @table_name_list > N'' THEN 0
ELSE 1 END
-- process database list
IF OBJECT_ID(N'tempdb..#db') IS NOT NULL
DROP TABLE #db
CREATE TABLE #db(
name sysname
PRIMARY KEY
WITH(
IGNORE_DUP_KEY = ON))
;WITH
DB AS(
SELECT
name = LTRIM(RTRIM(T.c.value('.[1]', 'sysname')))
FROM(
SELECT
database_name_list = CONVERT(xml,
N'<c><![CDATA['
+ REPLACE(@database_name_list, N',', N']]></c><c><![CDATA[')
+ N']]></c>')
)A
CROSS APPLY A.database_name_list.nodes('/c') T(c)
)
INSERT #db(
name)
SELECT
name
FROM sys.databases D WITH(NOLOCK)
WHERE (@flag_all_database = 1 AND name NOT IN(N'master', N'model', N'msdb', N'tempdb', N'distribution', N'temptable'))
OR EXISTS(
SELECT * FROM DB
WHERE name = D.name)
-- process table list
IF OBJECT_ID(N'tempdb..#tb') IS NOT NULL
DROP TABLE #tb
CREATE TABLE #tb(
name sysname
PRIMARY KEY
WITH(
IGNORE_DUP_KEY = ON))
IF @flag_all_table = 0
BEGIN
WITH
TB AS(
SELECT
name = LTRIM(RTRIM(T.c.value('.[1]', 'sysname')))
FROM(
SELECT
table_name_list = CONVERT(xml,
N'<c><![CDATA['
+ REPLACE(@table_name_list, N',', N']]></c><c><![CDATA[')
+ N']]></c>')
)A
CROSS APPLY A.table_name_list.nodes('/c') T(c)
)
INSERT #tb(
name)
SELECT
*
FROM tb
WHERE name > N''
END
-- =================================================
-- process on each database
-- =================================================
-- process script
DECLARE
@sql_index nvarchar(max)
SELECT
@sql_index = N'
DECLARE
@db_id int,
@db_name sysname,
@mode sysname
SELECT
@db_id = DB_ID(),
@db_name = DB_NAME(),
@mode = N''LIMITED''
-- fetch all index
DECLARE CUR_Index CURSOR LOCAL FORWARD_ONLY READ_ONLY STATIC
FOR
WITH
PT AS(
SELECT
object_id, index_id,
partition_count = COUNT (*)
FROM sys.partitions
GROUP BY object_id, index_id
),
COLMAX AS(
SELECT C.object_id
FROM sys.columns C WITH(NOLOCK), sys.types T
WHERE C.user_type_id = T.user_type_id
AND(
C.user_type_id IN(34, 35, 99)
OR (C.user_type_id IN(165, 167, 231, 241) AND C.max_length = -1))
)
SELECT
IX.object_id,
IX.index_id,
object_name = O.name,
schema_name = S.name,
index_name = IX.name,
partition_count = PT.partition_count,
allow_page_locks = IX.allow_page_locks,
has_maxcolumn = CASE
WHEN EXISTS(
SELECT * FROM COLMAX
WHERE object_id = IX.object_id)
THEN 1
ELSE 0 END
FROM sys.indexes IX WITH(NOLOCK)
INNER JOIN sys.objects O
ON IX.object_id = O.object_id
INNER JOIN sys.schemas S
ON S.schema_id = O.schema_id
INNER JOIN PT
ON IX.object_id = PT.object_id
AND IX.index_id = PT.index_id
WHERE O.is_ms_shipped = 0
AND O.name NOT LIKE N''%MarkDelete%''
AND IX.index_id > 0'
+ CASE
WHEN @flag_all_table = 1 THEN N''
ELSE N'
AND EXISTS(
SELECT * FROM #tb
WHERE name = O.name)
'
END
+ N'
DECLARE
@_log_recordid_index int,
@_log_recordid_defrage int,
@object_id int,
@index_id int,
@object_name sysname,
@schema_name sysname,
@index_name sysname,
@partition_count int,
@allow_page_locks bit,
@has_maxcolumn int
OPEN CUR_Index
FETCH CUR_Index INTO @object_id, @index_id, @object_name, @schema_name, @index_name, @partition_count, @allow_page_locks, @has_maxcolumn
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRY
-- record index process
SET @_log_recordid_index = NULL
INSERT TempTable.dbo.DBAIndexErrorLog(
DatabaseName, TableName, IndexName,
SQLCommand)
VALUES(
@db_name, QUOTENAME(@schema_name) + N''.'' + QUOTENAME(@object_name), @index_name,
N''sys.dm_db_index_physical_stats('' + RTRIM(@db_id) + N'', '' + RTRIM(@object_id) + N'', '' + RTRIM(@index_id) + N'', NULL, '''''' + RTRIM(@mode) + '''''')'')
SET @_log_recordid_index = SCOPE_IDENTITY()
-- =====================================
-- fetch single index to defrage
-- =====================================
DECLARE CUR_IndexSingle CURSOR LOCAL FORWARD_ONLY READ_ONLY STATIC
FOR
WITH
IDX AS(
SELECT
-- avg_fragmentation_in_percent,
-- partition_number
avg_fragmentation_in_percent = MAX(avg_fragmentation_in_percent)
FROM sys.dm_db_index_physical_stats(@db_id, @object_id, @index_id, NULL, @mode)
WHERE avg_fragmentation_in_percent > 5
)
SELECT
SQL = N''ALTER INDEX '' + QUOTENAME(@index_name)
+ N'' ON '' + QUOTENAME(@schema_name) + N''.'' + QUOTENAME(@object_name)
+ CASE
WHEN avg_fragmentation_in_percent < 7 AND @allow_page_locks = 1 THEN N'' REORGANIZE''
ELSE N'' REBUILD''
+ CASE
WHEN (@flag_edition = 1 AND @index_id > 1)
OR (@index_id = @flag_edition AND @has_maxcolumn = 0)
THEN N'' WITH(ONLINE = ON)''
ELSE N''''
END
END
-- + CASE
-- WHEN @partition_count > 0
-- THEN N'' PARTITION = '' + CONVERT(nvarchar(20), partition_number)
-- ELSE N''''
-- END
FROM IDX
DECLARE
@sql nvarchar(max)
OPEN CUR_IndexSingle
FETCH CUR_IndexSingle INTO @sql
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRY
-- record index defrage
SET @_log_recordid_defrage = NULL
INSERT TempTable.dbo.DBAIndexErrorLog(
DatabaseName, TableName, IndexName,
SQLCommand)
VALUES(
@db_name, QUOTENAME(@schema_name) + N''.'' + QUOTENAME(@object_name), @index_name,
@sql)
SET @_log_recordid_defrage = SCOPE_IDENTITY()
-- index defrage
-- PRINT(@sql)
EXEC sp_executesql @sql
-- update index defrage record
UPDATE A SET
FinishDate = GETDATE(),
ProcessFlag = 1
FROM TempTable.dbo.DBAIndexErrorLog A
WHERE IDENTITYCOL = @_log_recordid_defrage
UPDATE A SET
ProcessFlag = 1
FROM TempTable.dbo.DBAIndexErrorLog A
WHERE IDENTITYCOL < @_log_recordid_defrage
AND ErrorNumber <> 0
AND ProcessFlag = 0
AND DatabaseID = CHECKSUM(@db_name)
AND TableID = CHECKSUM(QUOTENAME(@schema_name) + N''.'' + QUOTENAME(@object_name))
AND IndexID = CHECKSUM(@index_name)
END TRY
BEGIN CATCH
-- record index defrage error
IF @_log_recordid_defrage IS NULL
INSERT TempTable.dbo.DBAIndexErrorLog(
DatabaseName, TableName, IndexName,
SQLCommand,
FinishDate, ErrorNumber, ErrorDescription)
VALUES(
@db_name, QUOTENAME(@schema_name) + N''.'' + QUOTENAME(@object_name), @index_name,
@sql,
GETDATE(), ERROR_NUMBER(), ERROR_MESSAGE())
ELSE
UPDATE A SET
FinishDate = GETDATE(),
ErrorNumber = ERROR_NUMBER(),
ErrorDescription = ERROR_MESSAGE()
FROM TempTable.dbo.DBAIndexErrorLog A
WHERE IDENTITYCOL = @_log_recordid_defrage
END CATCH
FETCH CUR_IndexSingle INTO @sql
END
CLOSE CUR_IndexSingle
DEALLOCATE CUR_IndexSingle
-- update index process record
UPDATE A SET
FinishDate = GETDATE(),
ProcessFlag = 1
FROM TempTable.dbo.DBAIndexErrorLog A
WHERE IDENTITYCOL = @_log_recordid_index
UPDATE A SET
ProcessFlag = 1
FROM TempTable.dbo.DBAIndexErrorLog A
WHERE IDENTITYCOL < @_log_recordid_index
AND ErrorNumber <> 0
AND ProcessFlag = 0
AND DatabaseID = CHECKSUM(@db_name)
AND TableID = CHECKSUM(QUOTENAME(@schema_name) + N''.'' + QUOTENAME(@object_name))
AND IndexID = CHECKSUM(@index_name)
END TRY
BEGIN CATCH
-- record index error
IF @_log_recordid_defrage IS NULL
INSERT TempTable.dbo.DBAIndexErrorLog(
DatabaseName, TableName, IndexName,
SQLCommand,
FinishDate, ErrorNumber, ErrorDescription)
VALUES(
@db_name, QUOTENAME(@schema_name) + N''.'' + QUOTENAME(@object_name), @index_name,
N''sys.dm_db_index_physical_stats('' + RTRIM(@db_id) + N'', '' + RTRIM(@object_id) + N'', '' + RTRIM(@index_id) + N'', NULL, '''''' + RTRIM(@mode) + '''''')'',
GETDATE(), ERROR_NUMBER(), ERROR_MESSAGE())
ELSE
UPDATE A SET
FinishDate = GETDATE(),
ErrorNumber = ERROR_NUMBER(),
ErrorDescription = ERROR_MESSAGE()
FROM TempTable.dbo.DBAIndexErrorLog A
WHERE IDENTITYCOL = @_log_recordid_index
END CATCH
FETCH CUR_Index INTO @object_id, @index_id, @object_name, @schema_name, @index_name, @partition_count, @allow_page_locks, @has_maxcolumn
END
CLOSE CUR_Index
DEALLOCATE CUR_Index
'
-- for each database
DECLARE CUR_db CURSOR LOCAL FORWARD_ONLY READ_ONLY STATIC
FOR
SELECT * FROM #db
DECLARE
@db_name sysname,
@sql nvarchar(max)
OPEN CUR_db
FETCH CUR_db INTO @db_name
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT
@sql = N'
USE ' + QUOTENAME(@db_name) + N'
RAISERROR(N''process on database "' + REPLACE(@db_name, N'''', N'''''') + N'"'', 10, 1) WITH NOWAIT
'
+ @sql_index
EXEC sp_executesql @sql,
N'
@flag_edition int
',
@flag_edition
FETCH CUR_db INTO @db_name
END
CLOSE CUR_db
DEALLOCATE CUR_db
END TRY
BEGIN CATCH
DECLARE
@ErrorMessage nvarchar(4000),
@ErrorNumber int,
@ErrorSeverity int,
@ErrorState int,
@ErrorLine int,
@ErrorProcedure nvarchar(200)
SELECT
@ErrorNumber = ERROR_NUMBER(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE(),
@ErrorLine = ERROR_LINE(),
@ErrorProcedure = ISNULL(ERROR_PROCEDURE(), '-'),
@ErrorMessage = ERROR_MESSAGE();
RAISERROR(
N'Error %d, Level %d, State %d, Procedure %s, Line %d, Message %s ',
@ErrorSeverity,
1,
@ErrorNumber,
@ErrorSeverity,
@ErrorState,
@ErrorProcedure,
@ErrorLine,
@ErrorMessage
)
END CATCH
GO
</Entry><Entry KeyWord="index rebuild jy85(2011)" ActionWord=" " Tipo="1" Flag="0">
SELECT * FROM sys.dm_db_index_physical_stats
(DB_ID(N'ItemMaintain'), OBJECT_ID(N'R_ItemL7DSVSummaryBySO'), NULL, NULL , null);
GO
select * from sys.indexes where
object_id=object_id('R_ItemL7DSVSummaryBySO')
go
ALTER INDEX IX_ItemNumber_CountryCode ON dbo.R_ItemL7DSVSummaryBySO REBUILD ;</Entry></Snippet>
GO
/* BYDBA 1 不建议使用联合主键,而是用自增列配合"创建唯一约束"或"创建唯一索引"
--创建唯一约束的方法
CREATE TABLE tb_test
(
id INT IDENTITY NOT NULL,
UniqueASNNumber CHAR(10) NOT NULL,
PackageLabel CHAR(12) NOT NULL constraint DF_tb_PackageLabel default(''),
CONSTRAINT PK_TABLE PRIMARY KEY (id),
CONSTRAINT UK_TABLE UNIQUE (PackageLabel, UniqueASNNumber)
)
--创建唯一索引的方法
CREATE UNIQUE NONCLUSTERED INDEX [IXU_TABLE_CODE1_CODE2] ON dbo.[TABLE]
(
[Code1],[Code2]
)WITH (FILLFACTOR=90) ON [PRIMARY]
*/
--覆盖索引
create nonclustered index ix_itemRateOfCustomer_item_CountryCode_CompanyCode on itemRateOfCustomer
(item) include(CountryCode,CompanyCode) WITH (FILLFACTOR=90) ON [PRIMARY]
--添加主键----------
ALTER TABLE 表名
ADD CONSTRAINT [PK_表名] PRIMARY KEY CLUSTERED(ID,Name)
--添加主键已经其他属性
ALTER TABLE ttt WITH NOCHECK
ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID PRIMARY KEY CLUSTERED (id)
WITH (FILLFACTOR = 75, ONLINE = ON, PAD_INDEX = ON);
---删除主键--------------
ALTER TABLE DropShipPickingShortage
Drop CONSTRAINT PK_DropShipPickingShortage
---创建索引
CREATE NONCLUSTERED INDEX IX_TABLE1_FIELD ON dbo.TABLE1
(
[FIELD] ASC
)WITH (FILLFACTOR = 90) ON [PRIMARY]
--删除索引----------------
IF EXISTS (
SELECT 1 FROM sys.indexes WITH(NOLOCK)
WHERE object_id = OBJECT_ID(N'[dbo].[arinvt01]') AND [name] = N'IX_arinvt01_filed'
)
DROP INDEX IX_arinvt01_filed ON [dbo].[arinvt01] WITH ( ONLINE = OFF )
--删除列----------------
alter table ItemXmlProperties
drop column TransactionNumber
--删除统计信息-----------------
IF EXISTS (
SELECT 1
FROM sys.stats WITH(NOLOCK)
WHERE object_id = OBJECT_ID(N'[dbo].[arinvt01]')
AND [name] = N'Statistic_BEG_ACC')
DROP STATISTICS [dbo].[Arinvt01].[Statistic_BEG_ACC]
---添加默认属性
ALTER TABLE [dbo].[IM_ItemPriceChangeBuffer]
ADD CONSTRAINT DF_IM_ItemPriceChangeBuffer_PromotionDescription
DEFAULT ('') FOR PromotionDescription
GO
---添加默认属性跟新现有行
ALTER TABLE dbo.doc_exf
ADD AddDate smalldatetime NULL
CONSTRAINT DF_doc_exf_AddDate
DEFAULT GETDATE() WITH VALUES ;
-----删除默认属性
if exists(
select 1 from sys.default_constraints
where parent_object_id =object_id('IM_Warranty')
and name='DF_IM_Warranty_WarrantyName'
)
ALTER TABLE IM_Warranty DROP CONSTRAINT DF_Jobs_JobId
------添加新列,约束
ALTER TABLE dbo.doc_exc
ADD column_b VARCHAR(20) NULL
CONSTRAINT exb_unique UNIQUE ;
---添加约束,将使用WITH NOCHECK 以避免根据现有行验证该约束,从而允许添加该约束。
ALTER TABLE dbo.doc_exd
WITH NOCHECK
ADD CONSTRAINT exd_check CHECK (column_a > 1) ;
----更改列的排序规则
ALTER TABLE T3
ALTER COLUMN C2 varchar(50) COLLATE Latin1_General_BIN
GO
------添加外键---------
ALTER TABLE Person.ContactBackup
ADD CONSTRAINT FK_ContactBacup_Contact FOREIGN KEY (ContactID)
REFERENCES Person.Person (BusinessEntityID) ;
--配置表的更改跟踪
--下面的示例启用AdventureWorks2008R2 数据库中Person.Person 表的更改跟踪。
USE AdventureWorks2008R2;
ALTER TABLE Person.Person
ENABLE CHANGE_TRACKING;
--下面的示例启用更改跟踪,并启用在进行某项更改期间会进行更新的列的跟踪。
USE AdventureWorks2008R2;
ALTER TABLE Person.Person
ENABLE CHANGE_TRACKING
WITH (TRACK_COLUMNS_UPDATED = ON)
--下面的示例禁用AdventureWorks2008R2 数据库中Person.Person 表的更改跟踪。
USE AdventureWorks2008R2;
ALTER TABLE Person.Person
DISABLE CHANGE_TRACKING;
-----下面的三个语句添加名为CS 的列集,然后将列C2 和C3 修改为SPARSE。
ALTER TABLE T2
ADD CS XML COLUMN_SET FOR ALL_SPARSE_COLUMNS ;
GO
ALTER TABLE T2
ALTER COLUMN C2 ADD SPARSE ;
GO
ALTER TABLE T2
ALTER COLUMN C3 ADD SPARSE ;
GO
--------------------------禁用约束,启用约束-------------------
CREATE TABLE dbo.cnst_example
(id INT NOT NULL,
name VARCHAR(10) NOT NULL,
salary MONEY NOT NULL
CONSTRAINT salary_cap CHECK (salary < 100000)
);
-- Valid inserts
INSERT INTO dbo.cnst_example VALUES (1,'Joe Brown',65000);
INSERT INTO dbo.cnst_example VALUES (2,'Mary Smith',75000);
-- This insert violates the constraint.
INSERT INTO dbo.cnst_example VALUES (3,'Pat Jones',105000);
-- Disable the constraint and try again.
ALTER TABLE dbo.cnst_example NOCHECK CONSTRAINT salary_cap;
INSERT INTO dbo.cnst_example VALUES (3,'Pat Jones',105000);
-- Re-enable the constraint and try another insert; this will fail.
ALTER TABLE dbo.cnst_example CHECK CONSTRAINT salary_cap;
INSERT INTO dbo.cnst_example VALUES (4,'Eric James',110000) ;
</Entry><Entry KeyWord="Query Job
(2011)" ActionWord=" " Tipo="1" Flag="0">--CMD Query Job
use msdb
go
select * from dbo.sysjobs a
inner join dbo.sysjobsteps b
on a.job_id = b.job_id
where b.command like '%UP_EC_InsertRMAExtendedWarrantyItem%'
--CMD Query Job
use msdb
go
sp_help_jobschedule @job_id =''
</Entry><Entry KeyWord="_MarkDelete sp_rename(2011)" ActionWord=" " Tipo="1" Flag="0"> _MarkDelete_20090311_UP_SPNAME
---rename 主键
EXEC sp_rename '[ItemPriceSetting].PK_tmp_ItemPriceSetting','PK_ItemPriceSetting','index'
EXEC sp_rename '[tmp_ItemPriceSetting]','ItemPriceSetting'</Entry><Entry KeyWord="Query Replication(2011)" ActionWord="#queryRep" Tipo="1" Flag="0">use distribution
go
select *,(select drop_publication as [*] FOR XML PATH ('root'),TYPE ) from
(
SELECT
DISTINCT p.publication
,ss.name AS subscriber
,p.publisher_db
,a.article
,s.Subscriber_DB --,ss.server_id,P.*
,CHAR(10)+CHAR(10)+
'use '+p.publisher_db+CHAR(10)+' go'+CHAR(10)+
'EXEC sp_Dropsubscription @publication = N'''+p.publication+''''+CHAR(10)+
',@subscriber = N'''+ss.name+''''+CHAR(10)+
',@destination_db = N'''+Subscriber_DB+''''+CHAR(10)+
',@article = N'''+a.article+''''+CHAR(10)+
'EXEC sp_DropArticle @publication = N'''+p.publication+''''+CHAR(10)+
',@article = N'''+a.article+''''+CHAR(10)+CHAR(10)
as drop_publication
FROM dbo.MSsubscriptions AS s WITH (NOLOCK)
INNER JOIN sys.servers AS ss WITH (NOLOCK)
ON s.subscriber_id =ss.server_id
INNER JOIN dbo.MSpublications AS p WITH (NOLOCK)
ON p.publisher_id=s.publisher_id
AND p.publisher_db=s.publisher_db
AND p.publication_id = s.publication_id
INNER JOIN dbo.MSarticles AS a
ON p.publisher_id=a.publisher_id
AND p.publisher_db=a.publisher_db
AND p.publication_id = a.publication_id
WHERE
a.article ='SAPSD_MKP_InventoryStorageFee'
) C</Entry><Entry KeyWord="ipaddress(2011)" ActionWord=" " Tipo="1" Flag="0">
select distinct @@SERVERNAME server,local_net_address as ip,local_tcp_port sqlport from sys.dm_exec_connections
where net_transport='tcp' and protocol_type='tsql'
SELECT @@SERVERNAME, name,port FROM master.sys.tcp_endpoints
where [type]=3 and type_desc='SERVICE_BROKER'
</Entry><Entry KeyWord="动态 sp_executesql (2011)" ActionWord=" " Tipo="1" Flag="0">declare @num int,@sql nvarchar(4000),@count int;
set @num=245;
set @sql=N'select @count1=count(*) from dbo.tb_ErrorLog where error_number=@num1';
exec sp_executesql @sql, N'@num1 int,@count1 int output', @num1=@num,@count1=@count output
select @count
--- like 传参数
declare @sql nvarchar(4000)
set @sql='select * from tb where name like @name'
exec sp_executesql @sql ,N'@name varchar(50)',@name='%fs%'
</Entry><Entry KeyWord="job disable&amp;rename(2011)" ActionWord=" " Tipo="1" Flag="0">
use msdb
go
EXEC msdb..sp_update_job @job_name = N'job',
@new_name = N'MarkDelete_20100923_job',@enabled=0
</Entry><Entry KeyWord="查看hosts 文件(2011)" ActionWord=" " Tipo="1" Flag="0">declare @t table
(
id int identity(1,1)
,text varchar(max)
)
Insert into @t
EXEC xp_cmdshell 'type C:\Windows\System32\Drivers\etc\hosts'
select *
from @t
where Text not like '#%'</Entry><Entry KeyWord="user create hash password login(2011)" ActionWord=" " Tipo="1" Flag="0">--寻找用户的hashword
SELECT password_hash, *
FROM sys.sql_logins L WITH(NOLOCK)
where name='edidbo'
--根据hashword 创建用户
CREATE LOGIN [EDIDbo]
WITH PASSWORD = 0x0100352AC183ADC9C0CEDA851011598D01ADC088449D8D4309C9
HASHED, SID = 0x26D34F54B8DE3446ABB74D4AE058FBD3,
CHECK_POLICY = OFF,
CHECK_EXPIRATION = OFF
</Entry><Entry KeyWord="bcp out(2011)" ActionWord=" " Tipo="1" Flag="0">BCP "ItemMaintainNewegg.dbo.arinvt01" OUT "arinvt01" /N /U RepDbo /P Rep@Dbo /S "S7QSQL07\D2WHP01"
pause</Entry><Entry KeyWord="bcp in(2011)" ActionWord=" " Tipo="1" Flag="0">BCP "ITEMMAINTAIN.dbo.arinvt01" In "arinvt01" /N /E /q /k /U RepDbo /P Rep@Dbo /b 50000 /S "S7QSQL01\ABS_SQL"
pause</Entry><Entry KeyWord="replication 同步 条件 查询(2011)" ActionWord=" " Tipo="1" Flag="0">
use DBAMonitor
GO
--EXEC ReplicationInfo.P_ReplicationInfo
-- @search_object = N'dropshipmaster'
--GO
select *
from ReplicationInfo.v_Info
where article_name IN( 'NewEgg_SOMaster','Newegg_SoTransaction')
--and publisher_server = 'D2whp01'
--select * from sys.views
--where schema_name(schema_id) = 'ReplicationInfo'
---查询同步历史条件
select *
from ReplicationInfo.tb_Info
where article_name IN( 'NewEgg_SOMaster','Newegg_SoTransaction')
and row_filter is not null
--and publisher_server = 'D2whp01'</Entry><Entry KeyWord="replication 更新订阅状态(2011)" ActionWord=" " Tipo="1" Flag="0">--Publisher
/*Replication Error
1.The subscription(s) have been marked inactive and must be reinitialized.
NoSync subscriptions will need to be dropped and recreated.
*/
set nocount on
use distribution
go
select *
from dbo.MSsubscriptions with (NOLOCK)
where status=0
/*
update distribution.dbo.MSsubscriptions
set status = 0
where publisher_id = 0
and publisher_db = 'imk'
and publication_id =68
and subscriber_id = 12
and subscriber_db = 'imk'
*/
SET NOCOUNT ON
declare @sql nvarchar(max)
set @sql=N''
select @sql=@sql+N'USE distribution'+char(10)+N'GO'+char(10)
+N'update distribution.dbo.MSsubscriptions'
+char(10)+N'set status = 2'
+char(10)+N'where publisher_id='+CAST(publisher_id AS varchar)
+char(10)+N'and publisher_db = '''+publisher_db+''''
+char(10)+N'and publication_id ='+CAST(publication_id AS varchar)
+char(10)+N'and subscriber_id = '+CAST(subscriber_id AS varchar)
+char(10)+N'and subscriber_db = '''+subscriber_db+''''
+char(10)+N'GO'+char(10)
from distribution.dbo.MSsubscriptions with (NOLOCK)
where status=0
print @sql--(Copy出来执行就是了)
/*
The process could not connect to Subscriber 'XXXX'
1.network issue:Telnet
2.User and password are wrong
修改Subscribers property中的用户和密码
*/</Entry><Entry KeyWord="replication job(2011)" ActionWord=" " Tipo="1" Flag="0">EXEC msdb.dbo.sp_stop_job @job_name = N'S7QSQL05\S7EDIDB01-MKTPLS-Rp_MKTPLS_EHISSQL.MKT-S7QSQL04\EHISSQL-32'
EXEC msdb.dbo.sp_start_job @job_name = N'S7QSQL05\S7EDIDB01-MKTPLS-Rp_MKTPLS_EHISSQL.MKT-S7QSQL04\EHISSQL-32'</Entry><Entry KeyWord="TRIGGER (2011)" ActionWord=" " Tipo="1" Flag="0">/****** Object: DdlTrigger [TR_SRV_DBA_DDL_ALL] Script Date: 12/18/2010 19:23:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [TR_SRV_DBA_DDL_ALL]
ON ALL SERVER
WITH
EXECUTE AS N'sa'
FOR
DDL_SERVER_LEVEL_EVENTS,
DDL_DATABASE_LEVEL_EVENTS
AS
SET NOCOUNT ON;
SET ANSI_PADDING ON;
INSERT temptable.dbo.tb_DBA_DDL_All_master(
event_data
)
OUTPUT
inserted.id as id,
inserted.event_data.value(N'(/EVENT_INSTANCE/EventType/text())[1]', N'nvarchar(260)') as event_type,
inserted.event_data.value(N'(/EVENT_INSTANCE/PostTime/text())[1]', N'datetime') as post_time,
inserted.event_data.value(N'(/EVENT_INSTANCE/LoginName/text())[1]', N'nvarchar(260)') as login_name,
inserted.event_data.value(N'(/EVENT_INSTANCE/ServerName/text())[1]', N'nvarchar(260)') as server_name,
inserted.event_data.value(N'(/EVENT_INSTANCE/DatabaseName/text())[1]', N'nvarchar(260)') as database_name,
inserted.event_data.value(N'(/EVENT_INSTANCE/SchemaName/text())[1]', N'nvarchar(260)') as schema_name,
inserted.event_data.value(N'(/EVENT_INSTANCE/ObjectType/text())[1]', N'nvarchar(260)') as object_type,
inserted.event_data.value(N'(/EVENT_INSTANCE/ObjectName/text())[1]', N'nvarchar(260)') as object_name,
inserted.event_data.value(N'(/EVENT_INSTANCE/TSQLCommand/CommandText/text())[1]', N'nvarchar(max)') as command
INTO temptable.dbo.tb_DBA_DDL_All_detial(
master_id,
event_type, post_time, login_name,
server_name, database_name, schema_name, object_type, object_name,
command
)
VALUES(
EVENTDATA()
);
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
ENABLE TRIGGER [TR_SRV_DBA_DDL_ALL] ON ALL SERVER
GO
</Entry><Entry KeyWord="user与role的对应关系(2011)" ActionWord=" " Tipo="1" Flag="0">
declare @RoleName varchar(50), @UserName varchar(50), @CMD varchar(1000)
declare @databaseName varchar(50)
set @databaseName='test'
set @UserName = 'yind'
create Table #UserRoles(DatabaseName varchar(50),Role varchar(50))
create table #RoleMember
(DBRole varchar(100),
MemberName varchar(100),
MemberSid varbinary(2048))
set @CMD = 'use ?
truncate table #RoleMember
insert into #RoleMember
exec sp_helprolemember
insert into #UserRoles
(DatabaseName, Role)
select db_name(), dbRole
from #RoleMember
where MemberName = ''' + @UserName + ''''
exec sp_MSForEachDB @CMD
select * from #UserRoles
where @databaseName='' or DatabaseName=@databaseName
drop table #UserRoles
drop table #RoleMember</Entry><Entry KeyWord="select 查询只存在一种数据(2011)" ActionWord=" " Tipo="1" Flag="0">
use test
go
DECLARE @ItemList TABLE(
TransactionNumber INT IDENTITY(1,1) PRIMARY KEY,
ItemNumber CHAR(25)
)
INSERT INTO @ItemList(ItemNumber) VALUES ('GC-000-001')
INSERT INTO @ItemList(ItemNumber) VALUES ('GC-000-003')
if exists
(
select top 1 1 from
(
select COUNT(*) total ,sum(case when ItemNumber='GC-000-001' then 1 end) item from @ItemList
)c
where total=item and total<>0
)
SELECT 1
ELSE
SELECT 0
IF EXISTS
(
SELECT TOP 1 1 FROM @ItemList t WHERE ItemNumber = 'GC-000-001'
and not exists
( select top 1 1 from @ItemList c where c.ItemNumber<>'GC-000-001')
)
SELECT 1
ELSE
SELECT 0
</Entry><Entry KeyWord="删除identity列(2011)" ActionWord=" " Tipo="1" Flag="0">USE NewEgg
GO
ALTER TABLE [SerialNumber]
switch to [tmp_SerialNumber]
IF EXISTS(SELECT TOP 1 1 FROM [tmp_SerialNumber] WITH (NOLOCK))
DROP TABLE [SerialNumber]
ELSE
BEGIN
IF EXISTS(SELECT TOP 1 1 FROM [SerialNumber] WITH (NOLOCK))
RAISERROR('switch failed',16,1)
END
EXEC sp_rename '[tmp_SerialNumber]','SerialNumber'
EXEC sp_rename '[SerialNumber].PK_tmp_SerialNumber','PK_SerialNumber','index'
GO
</Entry><Entry KeyWord="创建删除fulltext (2011)" ActionWord=" " Tipo="1" Flag="0">
USE [eCommerce2005]
GO
--create catalog
CREATE FULLTEXT CATALOG [ftTestDBA]WITH ACCENT_SENSITIVITY = ON
AUTHORIZATION [dbo]
---创建全文索引
CREATE FULLTEXT INDEX ON [dbo].EC_AllocateInventory_Log--表
(
Memo LANGUAGE [English], --col
InUser LANGUAGE [English]--col
)
KEY INDEX [PK_EC_AllocateInventory_Log]--主键,唯一索引
ON ([ftTestDBA], --fulltext catalog
FILEGROUP [PRIMARY])
WITH (CHANGE_TRACKING = AUTO, STOPLIST = SYSTEM)
----删除全文索引
--DROP FULLTEXT INDEX ON EC_AllocateInventory_Log
--DROP FULLTEXT CATALOG [ftTestDBA]
</Entry><Entry KeyWord="注册表regedit(2011)" ActionWord=" " Tipo="1" Flag="0">Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\ConnectTo]
"DSQUERY"="DBNETLIB"
"S1DSQL01\\ABS_SQL"="DBMSSOCN,10.1.25.21,1433"
"S1DSQL01\\S7EIM01"="DBMSSOCN,10.1.25.21,41433"
"S1DSQL02\\S5RMADB01"="DBMSSOCN,10.1.25.22,1433"
"S1DSQL02\\D2HIS01"="DBMSSOCN,10.1.25.22,41433"
"S1DSQL03\\NEWSQL2"="DBMSSOCN,10.1.25.23,1433"
"S1DSQL04\\EHISSQL"="DBMSSOCN,10.1.25.24,1433"
"S1DSQL05\\APPSQL"="DBMSSOCN,10.1.25.25,41433"
"S7DSQL09\\S7FRA01"="DBMSSOCN,10.1.25.29,1433"
"S7DSQL09\\S7HISDB01"="DBMSSOCN,10.1.25.29,41433"
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSSQLServer\Client\ConnectTo]
"S1DSQL01\\ABS_SQL"="DBMSSOCN,10.1.25.21,1433"
"S1DSQL01\\S7EIM01"="DBMSSOCN,10.1.25.21,41433"
"S1DSQL02\\S5RMADB01"="DBMSSOCN,10.1.25.22,1433"
"S1DSQL02\\D2HIS01"="DBMSSOCN,10.1.25.22,41433"
"S1DSQL03\\NEWSQL2"="DBMSSOCN,10.1.25.23,1433"
"S1DSQL04\\EHISSQL"="DBMSSOCN,10.1.25.24,1433"
"S1DSQL05\\APPSQL"="DBMSSOCN,10.1.25.25,41433"
"S7DSQL09\\S7FRA01"="DBMSSOCN,10.1.25.29,1433"
"S7DSQL09\\S7HISDB01"="DBMSSOCN,10.1.25.29,41433"</Entry><Entry KeyWord="replication datacache(2011)" ActionWord=" " Tipo="1" Flag="0">
--ehissql
USE NCustomer
GO
SELECT
*
FROM dbo.sysarticles ART WITH(NOLOCK)
WHERE objid = OBJECT_ID(N'Newegg_Customer')
AND EXISTS(
SELECT 1
FROM dbo.syssubscriptions SUB WITH(NOLOCK)
WHERE ART.artid = SUB.artid
AND SUB.srvid <> -1 AND dest_db <> N'virtual'
AND SUB.srvname = @@SERVERNAME
AND SUB.dest_db = 'Datacache'
)
use DataCache
go
sp_helptext [sp_MSins__NCustomer_DBONewegg_Customer]
sp_helptext [sp_MSupd_NCustomer_DBONewegg_Customer]</Entry><Entry KeyWord="dts 导入identity数据(2011)" ActionWord=" " Tipo="1" Flag="0">dts可以导入identity数据,需要选择目的表的时候,设置 edit mappings.
设置 enable identity insert 为on
dts 可以只导入一些列,非所用列
</Entry><Entry KeyWord="bcp 导入identity列(2011)" ActionWord=" " Tipo="1" Flag="0">BCP in,
加-E可以显式指定IDENTITY列值
不加-E。自增列累加递增</Entry><Entry KeyWord="sql 导出excel(2011)" ActionWord=" " Tipo="1" Flag="0">
1、在SQL SERVER里查询Excel数据:
-- ======================================================
SELECT *
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\book1.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...[Sheet1$]
下面是个查询的示例,它通过用于 Jet 的 OLE DB 提供程序查询 Excel 电子表格。
SELECT *
FROM OpenDataSource ( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
-------------------------------------------------------------------------------------------------
2、将Excel的数据导入SQL server :
-- ======================================================
SELECT * into newtable
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\book1.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...[Sheet1$]
实例:
SELECT * into newtable
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
-------------------------------------------------------------------------------------------------
3、将SQL SERVER中查询到的数据导成一个Excel文件
-- ======================================================
T-SQL代码:
EXEC master..xp_cmdshell 'bcp 库名.dbo.表名out c:\Temp.xls -c -q -S"servername" -U"sa" -P""'
参数:S 是SQL服务器名;U是用户;P是密码
说明:还可以导出文本文件等多种格式
实例:
EXEC master..xp_cmdshell 'bcp saletesttmp.dbo.CusAccount out c:\temp1.xls -c -q -S"pmserver" -U"sa" -P"sa"'
EXEC master..xp_cmdshell 'bcp "SELECT au_fname, au_lname FROM pubs..authors ORDER BY au_lname" queryout C:\ authors.xls -c -Sservername -Usa -Ppassword'
在VB6中应用ADO导出EXCEL文件代码:
Dim cn As New ADODB.Connection
cn.open "Driver={SQL Server};Server=WEBSVR;DataBase=WebMis;UID=sa;WD=123;"
cn.execute "master..xp_cmdshell 'bcp "SELECT col1, col2 FROM 库名.dbo.表名" queryout E:\DT.xls -c -Sservername -Usa -Ppassword'"
------------------------------------------------------------------------------------------------
4、在SQL SERVER里往Excel插入数据:
-- ======================================================
insert into OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\Temp.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...table1 (A1,A2,A3) values (1,2,3)
T-SQL代码:
INSERT INTO
OPENDATASOURCE('Microsoft.JET.OLEDB.4.0',
'Extended Properties=Excel 8.0;Data source=C:\training\inventur.xls')...[Filiale1$]
(bestand, produkt) VALUES (20, 'Test')
insert into openrowset('Microsoft.Jet.OLEDB.4.0','EXCEL 8.0;HDR=YES;User id=admin;Password=;IMEX=1;
DATABASE=D:\Roy.xls', sheet1$)--(ID,Name)
select 2,'b'
insert into OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 8.0;HDR=YES;DATABASE=D:\Roy.xls',sheet1$)(ID,Name)
select 2,'b'
</Entry><Entry KeyWord="汇编 move(2011)" ActionWord=" " Tipo="1" Flag="0">mov xxx, dword ptr ds:[xxxxxxxx] dword 双字取DS段[XXXXXXXX] 中的数据,给出了段寄存器
mov xxx, dword ptr [xxxxxxxx] 没有给出段寄存器,取默认段
mov xxx, [xxxxxxxx] 直接寻址
</Entry><Entry KeyWord="汇编 mov ecx(2011)" ActionWord=" " Tipo="1" Flag="0">mov [ECX+EAX*4],edx
因为[ECX+EAX*4]就相当于一个数组里的某个下标值变量.
例如i是个数组,可以理解成这样 i[eax] = edx
这是一个数组 通常情况是在找背包物品基址的时候才出现的,
如金创药当前的物品下表为(也就是第一个格子) ,
那么eax就等于,也就是说,[ECX+0*4] 所以一般只要搜索ECX的值就行了,
这么说只是方便楼主理解吧!</Entry><Entry KeyWord="汇编 寄存器(2011)" ActionWord=" " Tipo="1" Flag="0">在8086里面,16位通用寄存器为ax,bx,cx,dx,
在80386里,寄存器为32位,对应8086,即为eax,ebx,ecx,edx
dword ptr fs:[0] 表示fs*16+0处的一个双字
另外,div ebx 即 (edx,eax)/ebx
这里显然应为mov edx,0 ,或者直接用CDQ对cdx进行扩展,CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)
整个代码的意思就是:
先将00501a32入栈,再将fs*16+0处的一个双字入栈,再做除法
(edx,eax)/ebx
附:关于寄存器:
计算机寄存器分类简介:
32位CPU所含有的寄存器有:
4个数据寄存器(EAX、EBX、ECX和EDX)
2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)
6个段寄存器(ES、CS、SS、DS、FS和GS)
1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)
1、数据寄存器
数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。
对低16位数据的存取,不会影响高16位的数据。
这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。
4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。
程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。
寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。可用于乘、 除、输入/输出等操作,使用频率很高;
寄存器EBX称为基地址寄存器(Base Register)。它可作为存储器指针来使用;
寄存器ECX称为计数寄存器(Count Register)。
在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;
寄存器EDX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,
在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,
而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
2、变址寄存器
32位CPU有2个32位通用寄存器ESI和EDI。
其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。
寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,
用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的功能。
3、指针寄存器
其低16位对应先前CPU中的BP和SP,对低16位数据的存取,不影响高16位的数据。
32位CPU有2个32位通用寄存器EBP和ESP。
它们主要用于访问堆栈内的存储单元,并且规定:
EBP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据;
ESP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶。
寄存器EBP、ESP、BP和SP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,
用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
指针寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
4、段寄存器
段寄存器是根据内存分段的管理模式而设置的。内存单元的物理地址由段寄存器的值和一个偏移量组合而成
的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址。
CPU内部的段寄存器:
ECS——代码段寄存器(Code Segment Register),其值为代码段的段值;
EDS——数据段寄存器(Data Segment Register),其值为数据段的段值;
EES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
ESS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值;
EFS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
EGS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。
在16位CPU系统中,它只有4个段寄存器,所以,程序在任何时刻至多有4个正在使用的段可直接访问;在32位
微机系统中,它有6个段寄存器,所以,在此环境下开发的程序最多可同时访问6个段。
32位CPU有两个不同的工作方式:实方式和保护方式。在每种方式下,段寄存器的作用是不同的。有关规定简
单描述如下:
实方式: 前4个段寄存器CS、DS、ES和SS与先前CPU中的所对应的段寄存器的含义完全一致,内存单元的逻辑
地址仍为“段值:偏移量”的形式。为访问某内存段内的数据,必须使用该段寄存器和存储单元的偏移量。
保护方式: 在此方式下,情况要复杂得多,装入段寄存器的不再是段值,而是称为“选择子”(Selector)的某个值。。
5、指令指针寄存器
32位CPU把指令指针扩展到32位,并记作EIP,EIP的低16位与先前CPU中的IP作用相同。
指令指针EIP、IP(Instruction Pointer)是存放下次将要执行的指令在代码段的偏移量。
在具有预取指令功能的系统中,下次要执行的指令通常已被预取到指令队列中,除非发生转移情况。
所以,在理解它们的功能时,不考虑存在指令队列的情况。
6、标志寄存器
一、运算结果标志位
1、进位标志CF(Carry Flag)
进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。
使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。
2、奇偶标志PF(Parity Flag)
奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。
利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。
3、辅助进位标志AF(Auxiliary Carry Flag)
在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:
(1)、在字操作时,发生低字节向高字节进位或借位时;
(2)、在字节操作时,发生低4位向高4位进位或借位时。
对以上6个运算结果标志位,在一般编程情况下,标志位CF、ZF、SF和OF的使用频率较高,而标志位PF和AF的使用频率较低。
4、零标志ZF(Zero Flag)
零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。
5、符号标志SF(Sign Flag)
符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。
6、溢出标志OF(Overflow Flag)
溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。
“溢出”和“进位”是两个不同含义的概念,不要混淆。</Entry><Entry KeyWord="汇编 有符号数和无符号数探讨(2011)" ActionWord=" " Tipo="1" Flag="0">汇编补码
若是单字节
就看最高位是否为1,为1就为负数,为0为正数
对负数求单字节补码就可以知道负多少
若是双字节就看高8位字节的最高位是否为1,为1就为负数,为0为正数
对负数求双字节补码就可以知道负多少
-20机器中的是
10010100 负数源码
11101011 反码
11101100 补码(计算机存储)128+64+32+8+4=236
运算-20,加2 的结果
11101100
---+
00000010
------------
11101110 (如果是正数238)
取反+1=补码
10010001+1=10010010=-18
有符号数和无符号数探讨
这个问题,要是简单的理解,是很容易的,不过要是考虑的深了,还真有些东西呢。
下面我就把这个东西尽量的扩展一点,深入一点和大家说说。
一、只有一个标准!
在汇编语言层面,声明变量的时候,没有 signed 和 unsignde 之分,汇编器统统,将你输入的整数字面量当作有符号数处理成补码存入到计算机中,只有这一个标准!汇编器不会区分有符号还是无符号然后用两个标准来处理,它统统当作有符号的!并且统统汇编成补码!也就是说,db -20 汇编后为:EC ,而 db 236 汇编后也为 EC 。这里有一个小问题,思考深入的朋友会发现,db 是分配一个字节,那么一个字节能表示的有符号整数范围是:-128 ~ +127 ,那么 db 236 超过了这一范围,怎么可以?是的,+236 的补码的确超出了一个字节的表示范围,那么拿两个字节(当然更多的字节更好了)是可以装下的,应为:00 EC,也就是说 +236的补码应该是00 EC,一个字节装不下,但是,别忘了“截断”这个概念,就是说最后汇编的结果被截断了,00 EC 是两个字节,被截断成 EC ,所以,这是个“美丽的错误”,为什么这么说?因为,当你把 236 当作无符号数时,它汇编后的结果正好也是 EC ,这下皆大欢喜了,虽然汇编器只用一个标准来处理,但是借用了“截断”这个美丽的错误后,得到的结果是符合两个标准的!也就是说,给你一个字节,你想输入有符号的数,比如 -20 那么汇编后的结果是符合有符号数的;如果你输入 236 那么你肯定当作无符号数来处理了(因为236不在一个字节能表示的有符号数的范围内啊),得到的结果是符合无符号数的。于是给大家一个错觉:汇编器有两套标准,会区分有符号和无符号,然后分别汇编。其实,你们被骗了。:-)
二、存在两套指令!
第一点说明汇编器只用一个方法把整数字面量汇编成真正的机器数。但并不是说计算机不区分有符号数和无符号数,相反,计算机对有符号和无符号数区分的十分清晰,因为计算机进行某些同样功能的处理时有两套指令作为后备,这就是分别为有符号和无符号数准备的。但是,这里要强调一点,一个数到底是有符号数还是无符号数,计算机并不知道,这是由你来决定的,当你认为你要处理的数是有符号的,那么你就用那一套处理有符号数的指令,当你认为你要处理的数是无符号的,那就用处理无符号数的那一套指令。加减法只有一套指令,因为这一套指令同时适用于有符号和无符号。下面这些指令:mul div movzx … 是处理无符号数的,而这些:imul idiv movsx … 是处理有符号的。
举例来说:
内存里有 一个字节x 为:0x EC ,一个字节 y 为:0x 02 。当把x,y当作有符号数来看时,x = -20 ,y = +2 。当作无符号数看时,x = 236 ,y = 2 。下面进行加运算,用 add 指令,得到的结果为:0x EE ,那么这个 0x EE 当作有符号数就是:-18 ,无符号数就是 238 。所以,add 一个指令可以适用有符号和无符号两种情况。(呵呵,其实为什么要补码啊,就是为了这个呗,:-))
乘法运算就不行了,必须用两套指令,有符号的情况下用imul 得到的结果是:0x FF D8 就是 -40 。无符号的情况下用 mul ,得到:0x 01 D8 就是 472 。(参看文后附录2例程)
三、可爱又可怕的c语言。
为什么又扯到 c 了?因为大多数遇到有符号还是无符号问题的朋友,都是c里面的 signed 和 unsigned 声明引起的,那为什么开头是从汇编讲起呢?因为我们现在用的c编译器,无论gcc 也好,vc6 的cl 也好,都是将c语言代码编译成汇编语言代码,然后再用汇编器汇编成机器码的。搞清楚了汇编,就相当于从根本上明白了c,而且,用机器的思维去考虑问题,必须用汇编。(我一般遇到什么奇怪的c语言的问题都是把它编译成汇编来看。)
C 是可爱的,因为c符合kiss 原则,对机器的抽象程度刚刚好,让我们即提高了思维层面(比汇编的机器层面人性化多了),又不至于离机器太远(像c# ,java之类就太远了)。当初K&R 版的c就是高级一点的汇编……:-)
C又是可怕的,因为它把机器层面的所有的东西都反应了出来,像这个有没有符号的问题就是一例(java就不存在这个问题,因为它被设计成所有的整数都是有符号的)。为了说明它的可怕特举一例:
#include <stdio.h>
#include <string.h>
int main()
{
int x = 2;
char * str = "abcd";
int y = (x - strlen(str) ) / 2;
printf("%d\n",y);
}
结果应该是 -1 但是却得到:2147483647 。为什么?因为strlen的返回值,类型是size_t,也就是unsigned int ,与 int 混合计算时有符号类型被自动转换成了无符号类型,结果自然出乎意料。。。
观察编译后的代码,除法指令为 div ,意味无符号除法。
解决办法就是强制转换,变成 int y = (int)(x - strlen(str) ) / 2; 强制向有符号方向转换(编译器默认正好相反),这样一来,除法指令编译成 idiv 了。
我们知道,就是同样状态的两个内存单位,用有符号处理指令 imul ,idiv 等得到的结果,与用 无符号处理指令mul,div等得到的结果,是截然不同的!所以牵扯到有符号无符号计算的问题,特别是存在讨厌的自动转换时,要倍加小心!(这里自动转换时,无论gcc还是cl都不提示!!!)
为了避免这些错误,建议,凡是在运算的时候,确保你的变量都是 signed 的。
四、c的做法。
对于有符号和无符号的处理上,c语言层面做的更“人性化”一些。比如在声明变量的时候,c 有signed 和 unsigned 前缀来区别,而汇编呢,没有任何区别,把握全在你自己,比如:你想在一个字节中输入一个有符号数,那么这个数就别超过 -128 ~ +127 ,想输入无符号数,要保证数值在 0~255 之间。如果你输入了 236 ,你还要说你输入的是有符号数,那么你肯定错了,因为有符号数236至少要两个字节来存放(为00 EC),不要小看了那一个字节的00,在有符号乘法下,两个字节的00 EC 与 一个字节的EC,在与同样一个数相乘时,得到的结果是截然不同的!!!
我们来看下具体的列子(用vc6的cl编译器生成):
C语言 编译后生产的汇编语言
……
char x;
unsigned char y;
int z;
x = 3;
y = 236;
z = x*y;
…… ……
_x$ = -4
_y$ = -8
_z$ = -12
……
mov BYTE PTR _x$[ebp], 3
mov BYTE PTR _y$[ebp], 236
movsx eax, BYTE PTR _x$[ebp]
mov ecx, DWORD PTR _y$[ebp]
and ecx, 255
imul eax, ecx
mov DWORD PTR _z$[ebp], eax
……
我们看到,在赋值的时候(绿色部分),汇编后与本文第一条论述相同,是否有符号把握全在自己,c比汇编做的更好这一点没有得到体现,这也可以理解,因为c最终要被编译成汇编,汇编没有在变量声明时区分有无符号这一功能,自然,c也没有办法。但既然c提供了signed和unsigned声明,汇编后,肯定有代码体现这一点,表格里的红色部分就是。对有符号数x他进行了符号扩展,对无符号y进行了零扩展。这里为了举例的方便,进行了有符号数和无符号数的混合运算,实际编程中要避免这种情况。
(完)
附录:
1.计算机对有符号整数的表示只采取一套编码方式,不存在正数用原码,负数用补码这用两套编码之说,大多数计算机内部的有符号整数都是用补码,就是说无论正负,这个计算机内部只用补码来编码!!!只不过正数和0的补码跟他原码在形式上相同,负数的补码在形式上与其绝对值的原码取反加一相同。
2. 两套乘法指令结果例程:
;; 程序存储为 x.s
extern printf
global main
section .data
str1: db "%x",0x0d,0x0a,0
n: db 0x02
section .text
main:
xor eax,eax
mov al, 0xec
mul byte [n] ;有符号乘法指令为: imul
push eax
push str1
call printf
add esp,byte 4
ret
编译步骤:
1. nasm -felf x.s
2. gcc x.o
ubuntu7.04 下用nasm和gcc编译通过。结果符合文章所述
</Entry><Entry KeyWord="typedef (2011)" ActionWord=" " Tipo="1" Flag="0">1. 基本解释
typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(strUCt等)。
在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。
至于typedef有什么微妙之处,请你接着看下面对几个问题的具体阐述。
2. typedef &结构的问题
当用下面的代码定义一个结构时,编译器报了一个错误,为什么呢?莫非C语言不允许在结构中包含指向它自己的指针吗?请你先猜想一下,然后看下文说明:
typedef struct tagNode
{
char *pItem;
pNode pNext;
} *pNode;
答案与分析:
1、typedef的最简单使用
typedef long byte_4;
给已知数据类型long起个新名字,叫byte_4。
2、 typedef与结构结合使用
typedef struct tagMyStruct
{
int iNum;
long lLength;
} MyStruct;
这语句实际上完成两个操作:
1) 定义一个新的结构类型
struct tagMyStruct
{
int iNum;
long lLength;
};
分析:tagMyStruct称为“tag”,即“标签”,实际上是一个临时名字,struct 关键字和tagMyStruct一起,构成了这个结构类型,不论是否有typedef,这个结构都存在。
我们可以用struct tagMyStruct varName来定义变量,但要注意,使用tagMyStruct varName来定义变量是不对的,因为struct 和tagMyStruct合在一起才能表示一个结构类型。
2) typedef为这个新的结构起了一个名字,叫MyStruct。
typedef struct tagMyStruct MyStruct;
因此,MyStruct实际上相当于struct tagMyStruct,我们可以使用MyStruct varName来定义变量。
答案与分析
C语言当然允许在结构中包含指向它自己的指针,我们可以在建立链表等数据结构的实现上看到无数这样的例子,上述代码的根本问题在于typedef的应用。
根据我们上面的阐述可以知道:新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识pNode。
解决这个问题的方法有多种:
1)、
typedef struct tagNode
{
char *pItem;
struct tagNode *pNext;
} *pNode;
2)、
typedef struct tagNode *pNode;
struct tagNode
{
char *pItem;
pNode pNext;
};
注意:在这个例子中,你用typedef给一个还未完全声明的类型起新名字。C语言编译器支持这种做法。
3)、规范做法:
struct tagNode
{
char *pItem;
struct tagNode *pNext;
};
typedef struct tagNode *pNode;
3. typedef & #define的问题
有下面两种定义pStr数据类型的方法,两者有什么不同?哪一种更好一点?
typedef char *pStr;
#define pStr char *;
答案与分析:
通常讲,typedef要比#define要好,特别是在有指针的场合。请看例子:
typedef char *pStr1;
#define pStr2 char *;
pStr1 s1, s2;
pStr2 s3, s4;
在上述的变量定义中,s1、s2、s3都被定义为char *,而s4则定义成了char,不是我们所预期的指针变量,根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字。
#define用法例子:
#define f(x) x*x
main( )
{
int a=6,b=2,c;
c=f(a) / f(b);
printf("%d \n",c);
}
以下程序的输出结果是: 36。
因为如此原因,在许多C语言编程规范中提到使用#define定义时,如果定义中包含表达式,必须使用括号,则上述定义应该如下定义才对:
#define f(x) (x*x)
当然,如果你使用typedef就没有这样的问题。
4. typedef & #define的另一例
下面的代码中编译器会报一个错误,你知道是哪个语句错了吗?
typedef char * pStr;
char string[4] = "abc";
const char *p1 = string;
const pStr p2 = string;
p1++;
p2++;
答案与分析:
是p2++出错了。这个问题再一次提醒我们:typedef和#define不同,它不是简单的文本替换。上述代码中const pStr p2并不等于const char * p2。const pStr p2和const long x本质上没有区别,都是对变量进行只读限制,只不过此处变量p2的数据类型是我们自己定义的而不是系统固有类型而已。因此,const pStr p2的含义是:限定数据类型为char *的变量p2为只读,因此p2++错误。
(注:关于const的限定内容问题,在本系列第二篇有详细讲解)。
#define与typedef引申谈
1) #define宏定义有一个特别的长处:可以使用 #ifdef ,#ifndef等来进行逻辑判断,还可以使用#undef来取消定义。
2) typedef也有一个特别的长处:它符合范围规则,使用typedef定义的变量类型其作用范围限制在所定义的函数或者文件内(取决于此变量定义的位置),而宏定义则没有这种特性。
5. typedef & 复杂的变量声明
在编程实践中,尤其是看别人代码的时候,常常会遇到比较复杂的变量声明,使用typedef作简化自有其价值,比如:
下面是三个变量的声明,我想使用typdef分别给它们定义一个别名,请问该如何做?
>1:int *(*a[5])(int, char*);
>2:void (*b[10]) (void (*)());
>3. doube(*)() (*pa)[9];
答案与分析:
对复杂变量建立一个类型别名的方法很简单,你只要在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头就行了。
>1:int *(*a[5])(int, char*);
//pFun是我们建的一个类型别名
typedef int *(*pFun)(int, char*);
//使用定义的新类型来声明对象,等价于int* (*a[5])(int, char*);
pFun a[5];
>2:void (*b[10]) (void (*)());
//首先为上面表达式蓝色部分声明一个新类型
typedef void (*pFunParam)();
//整体声明一个新类型
typedef void (*pFun)(pFunParam);
//使用定义的新类型来声明对象,等价于void (*b[10]) (void (*)());
pFun b[10];
>3. doube(*)() (*pa)[9];
//首先为上面表达式蓝色部分声明一个新类型
typedef double(*pFun)();
//整体声明一个新类型
typedef pFun (*pFunParam)[9];
//使用定义的新类型来声明对象,等价于doube(*)() (*pa)[9];</Entry><Entry KeyWord="replication repair 同步精确(2011)" ActionWord=" " Tipo="1" Flag="0">USE Distribution
GO
SET NOCOUNT ON
DECLARE @command_id int
,@tsn nvarchar(50)
SELECT @command_id = 10
,@tsn = '0x00000AEE00003D8E001100000000'
IF OBJECT_ID('tempdb..#repl') IS NOT NULL
DROP TABLE #repl
CREATE TABLE #repl
( id int
PRIMARY KEY IDENTITY(1,1) NOT NULL
,xact_seno varbinary(16) NULL
,originator_srvname sysname NULL
,originator_db sysname NULL
,article_id int NULL
,type int NULL
,partial_command bit NULL
,hashkey int NULL
,originator_publication_id int NULL
,originator_db_version INT NULL
,originator_lsn varbinary(16) NULL
,command nvarchar(1024)
,command_id int NULL
)
DECLARE @cmd nvarchar(max)
SET @cmd = N'EXEC sp_browsereplcmds N' + QUOTENAME(@tsn,N'''')
+N',N'+ QUOTENAME(@tsn,N'''')
INSERT #repl EXEC (@cmd)
SELECT * FROM #repl
WHERE command_id=@command_id
</Entry><Entry KeyWord="Replication_重建同步(2011)" ActionWord=" " Tipo="1" Flag="0">-- ===========================================================
-- script for :
-- replication list
-- ===========================================================
SET NOCOUNT ON;
DECLARE
@ServerName sysname
;
SET @ServerName = @@SERVERNAME;
DECLARE
@sql nvarchar(max)
;
SET
@sql = N'
;WITH
ART AS(
SELECT
article_id = ART.artid,
publication_id = ART.pubid,
object_id = ART.objid,
article_name = ART.name,
destination_schema = ART.dest_owner,
destination_object = ART.dest_table,
row_filter = ART.filter_clause,
column_filter = CASE
WHEN (
SELECT COUNT(*) FROM sys.columns WITH(NOLOCK)
WHERE object_id = ART.objid
)
= (
SELECT COUNT(*) FROM dbo.sysarticlecolumns WITH(NOLOCK)
WHERE artid = ART.artid
)
THEN 0
ELSE 1
END,
ins_cmd,
upd_cmd,
del_cmd
FROM dbo.sysarticles ART WITH(NOLOCK)
UNION ALL
SELECT
article_id = ARTS.artid,
publication_id = ARTS.pubid,
object_id = ARTS.objid,
article_name = ARTS.name,
destination_schema = ARTS.dest_owner,
destination_object = ARTS.dest_object,
row_filter = NULL,
column_filter = 0,
ins_cmd = NULL,
upd_cmd = NULL,
del_cmd = NULL
FROM dbo.sysschemaarticles ARTS WITH(NOLOCK)
),
REPL AS(
SELECT
ART.article_id,
ART.publication_id,
ART.object_id,
ART.article_name,
ART.destination_schema,
ART.destination_object,
ART.row_filter,
ART.column_filter,
ART.ins_cmd,
ART.upd_cmd,
ART.del_cmd,
publication_name = PUB.name,
destination_server = SUB.srvname,
destination_database = SUB.dest_db
FROM ART
INNER JOIN dbo.syspublications PUB WITH(NOLOCK)
ON ART.publication_id = PUB.pubid
LEFT JOIN dbo.syssubscriptions SUB WITH(NOLOCK)
ON ART.article_id = SUB.artid
AND SUB.srvid <> -1 AND dest_db <> N''virtual'' -- not include virtual replication
-- when publication property @immediate_sync = true, will include virtual replication for each article
),
OBJ AS(
SELECT
OBJ.object_id,
object_type = OBJ.type,
schema_name = SCH.name,
object_name = OBJ.name
FROM sys.objects OBJ WITH(NOLOCK),
sys.schemas SCH WITH(NOLOCK)
WHERE OBJ.schema_id = SCH.schema_id
),
RE AS(
SELECT
publication_name = REPL.publication_name,
article_name = REPL.article_name,
object_type = OBJ.object_type,
publisher_server = @ServerName,
publisher_database = @database_name,
publisher_schema = OBJ.schema_name,
publisher_object = OBJ.object_name,
subscriber_server = REPL.destination_server,
subscriber_database = REPL.destination_database,
subscriber_schema = REPL.destination_schema,
subscriber_object = REPL.destination_object,
row_filter = REPL.row_filter,
column_filter = CONVERT(nvarchar(max),
CASE
WHEN column_filter = 0 THEN NULL
ELSE STUFF(
(
SELECT
N'','' + C.name
FROM sys.columns C WITH(NOLOCK),
dbo.sysarticlecolumns ARTC WITH(NOLOCK)
WHERE C.column_id = ARTC.colid
AND C.object_id = REPL.object_id
AND ARTC.artid = REPL.article_id
FOR XML PATH(''''), TYPE
).value(''/'', ''nvarchar(max)''),
1, 1, N'''')
END),
insert_cmd = CONVERT(nvarchar(255), REPL.ins_cmd),
update_cmd = CONVERT(nvarchar(255), REPL.upd_cmd),
delete_cmd = CONVERT(nvarchar(255), REPL.del_cmd)
FROM REPL, OBJ
WHERE REPL.object_id = OBJ.object_id
)
SELECT
publication_name,
article_name,
object_type,
publisher_server,
publisher_database,
publisher_schema,
publisher_object,
subscriber_server,
subscriber_database,
subscriber_schema,
subscriber_object,
row_filter,
column_filter,
insert_cmd,
update_cmd,
delete_cmd
FROM RE
';
DECLARE @tb_repliation TABLE(
publication_name sysname,
article_name sysname,
object_type char(2),
publisher_server sysname,
publisher_database sysname,
publisher_schema sysname,
publisher_object sysname,
subscriber_server sysname NULL,
subscriber_database sysname NULL,
subscriber_schema sysname NULL,
subscriber_object sysname NULL,
row_filter nvarchar(max),
column_filter nvarchar(max),
insert_cmd nvarchar(255),
update_cmd nvarchar(255),
delete_cmd nvarchar(255)
);
DECLARE
@s nvarchar(max),
@database_name sysname
;
DECLARE CUR_db CURSOR LOCAL FORWARD_ONLY READ_ONLY STATIC
FOR
SELECT
name
FROM sys.databases WITH(NOLOCK)
WHERE is_published = 1
AND state IN(0, 5) --AND name = 'DropShip'
;
OPEN CUR_db;
FETCH CUR_db INTO
@database_name
;
WHILE @@FETCH_STATUS = 0
BEGIN;
SET @s = N'
USE ' + QUOTENAME(@database_name) + N'
' + @sql;
INSERT @tb_repliation
EXEC sp_executesql
@s,
N'
@ServerName sysname,
@database_name sysname
',
@ServerName, @database_name
;
FETCH CUR_db INTO
@database_name
;
END;
CLOSE CUR_db;
DEALLOCATE CUR_db;
WITH
DATA AS(
SELECT
*
FROM @tb_repliation
WHERE subscriber_server IS NOT NULL
),
DB AS(
SELECT DISTINCT
publisher_server, publisher_database
FROM DATA
),
REQ AS(
SELECT DISTINCT
publication_name,
publisher_server,
publisher_database,
publisher_schema,
publisher_object,
publisher = QUOTENAME(publisher_server)
+ N'.' + QUOTENAME(publisher_database)
+ N'.' + QUOTENAME(publisher_schema)
+ N'.' + QUOTENAME(publisher_object),
subscriber_server,
subscriber_database,
subscriber_schema,
subscriber_object,
row_filter,
column_filter,
insert_cmd,
delete_cmd,
update_cmd
FROM DATA --WHERE publisher_database = N'svc2005'
--AND (publisher_object= N'RMAMaster' OR publisher_object= N'RMATransaction' )
)
----SELECT * FROM DB
SELECT
N'
UNION ALL
SELECT
publication_name = ' + ISNULL(N'N' + QUOTENAME(publication_name, N''''), N'NULL') + N',
publisher = N' + QUOTENAME(publisher, N'''') + N',
subscriber_server = N' + QUOTENAME(subscriber_server, N'''') + N',
subscriber_database = N' + QUOTENAME(subscriber_database, N'''') + N',
subscriber_schema = N' + QUOTENAME(subscriber_schema, N'''') + N',
subscriber_object = N' + QUOTENAME(subscriber_object, N'''') + N',
row_filter = ' + ISNULL(N'N''' + REPLACE(row_filter, N'''', N'''''') + N'''', N'NULL') + N',
column_filter = ' + ISNULL(N'N''' + REPLACE(column_filter, N'''', N'''''') + N'''', N'NULL') + N',
insert_cmd = ' + ISNULL(N'N''' + REPLACE(insert_cmd, N'''', N'''''') + N'''', N'NULL') + N',
delete_cmd = ' + ISNULL(N'N''' + REPLACE(delete_cmd, N'''', N'''''') + N'''', N'NULL') + N',
update_cmd = ' + ISNULL(N'N''' + REPLACE(update_cmd, N'''', N'''''') + N'''', N'NULL') + N'
'
FROM REQ
WHERE publication_name= N'Rp_IPP3_E5PORTALDB01.IPP3_02'
;</Entry><Entry KeyWord="查询 fulltext(2011)" ActionWord=" " Tipo="1" Flag="0">
use eCommerce2005
go
select * from sys.fulltext_catalogs
select OBJECT_NAME(object_id),* from sys.fulltext_indexes
--查询fulltext objectname and col
select OBJECT_NAME(ft.object_id),col.name, ft.* from sys.fulltext_index_columns ft
inner join sys.columns col
on ft.object_id=col.object_id
and ft.column_id=col.column_id
</Entry><Entry KeyWord="C++ struct (2011)" ActionWord=" " Tipo="1" Flag="0">node表示一个结构体,结构如下:
{
datatype data;
struct node *next;
}
StackNode的含义和node相同。
*LinkStack表示一个StackNode类型的指针,指向的对象是一个StackNode对象。
举例如下:
int main()
{
node a1;
struct node a2;
StackNode a3;
LinkStack ps;
ps = &a3;
return 0;
}</Entry><Entry KeyWord="c++ 指针(2011)" ActionWord=" " Tipo="1" Flag="0">第一种情况:
int *p;
cout<<p<<endl;
cout<<&p<<endl;
return 0;
结果:编译通过,执行错误。原因:指针p未初始化,野指针,引起内存错误。
第二种情况:
int *p=0; // 指针定义并初始化。注意:这里的不是给p赋值,而是初始化为空指针,等价于NULL。
cout<<p<<endl; // 输出: 。指的是指针p指向的地址,这里为空。
cout<<&p<<endl; // 输出:ff60 。指的是存放指针p的地址。
return 0;
结果:编译通过,执行通过。
第三种情况:
int *p=NULL; // 指针定义并初始化,初始化为空指针。
cout<<p<<endl; // 输出: 。指的是指针p指向的地址,这里为空。
cout<<&p<<endl; // 输出:ff60 。指的是存放指针p的地址。
return 0;
结果:编译通过,执行通过。这种情况等价于第二种情况,一般写为这种,不会引起歧义。
第四种情况:
int *p=1;
cout<<p<<endl;
cout<<&p<<endl;
return 0;
结果:编译不通过。原因:在指针p未分配内存空间的情况下,试图赋值。
第五种情况:
int *p = new int; // 指针定义并初始化,分配内存空间。
*p = 1; // 指针赋值。
cout<<*p<<endl; // 输出: 。指的是指针p指向的地址中存放的数据。
cout<<p<<endl; // 输出:b97e0。指的是指针p指向的内存地址。
cout<<&p<<endl; // 输出:ff60。指的是存放指针p的内存地址。
return 0;
结果:编译通过,执行通过。
</Entry><Entry KeyWord="typedef void (*Fun) (void)指针函数(2011)" ActionWord=" " Tipo="1" Flag="0">为便于理解,你可以这样解释:
typedef void(* Fun)(void) Fun
类似于
typedef int INT
Fun在声明以后,可以把它当作数据类型声明其他变量
Fun的确切意义是一个函数指针类型,该函数没有参数且无返回值
定义了一个int类型的变量i;
而这样
typedef INT int;
表示用户自己定义了一个整型数据类型INT,实际上就等同于int
所以:INT ii;
同上,表示定义了一个int类型的变量ii;
同样的:
void (*pFn)(void)
定义了一个函数指针,该函数指针指向 类似于 void Foo(void)函数的函数入口地址
而这样:
typedef void (*Fun)(void)
表示用户自己定义了一个函数指针数据类型
而
Fun pf;
表示定义了一个函数指针pf,改函数指针指向类似于void Foo(void)的函数 </Entry><Entry KeyWord="智力题(2011)" ActionWord=" " Tipo="1" Flag="0">
1000瓶药水,其中至多有1瓶剧毒,现在给你10只小狗在24小时内通过小狗试药的方式找出哪瓶药有毒或者全部无毒(小狗服完药20小时后才能判断是否中毒)
这道题目太残忍
把狗从0-9编号
把药水按1-1000编号
把药水编号按二进制,如果第i位(因为最大1000,所以bit位为0-9)bit位为1,则分给编号为i的狗狗喝
最后得一二进制数,如果编号为i的狗狗死了,该数的第i bit位为1,该数就是有毒的药水编号
要死多少条狗啊,…</Entry><Entry KeyWord="返回字符串长度strlen(2011)" ActionWord=" " Tipo="1" Flag="0">系统函数:
int strlen (const char * str)
{
int length = 0;
while( *str++ )
++length;
return( length );
}
不用中间变量:
int strlen (const char * str)
{
if(*str) return strlen(++str)+1;
return 0;
}
</Entry><Entry KeyWord="const char* str (2011)" ActionWord=" " Tipo="1" Flag="0">要记住:标准也是在妥协下的产物,标准上允许的不一定是正确的。
我没有读过C++标准,我也从来不是一个标准的拥趸,泛标准论本来就不是什么好事情
不过我相信在这方面我没法说服你,因为你很可能还没有理解软件工业化的许多痛苦,还是很坚持“标准”的。
我们假定标准规定char * a ="abcd"合法,那么标准自己是矛盾的。大家都知道"abcd"不是变量(如果你反驳,我就说什么都白搭),一个常量是不可能有非常量的地址的,而这个表达式的左侧是一个存储非常量地址的指针,标准怎么解释这种矛盾?
我还想说一个事实,char * a= "abcd",依赖编译器的不同,"abcd"放的位置可能是只读存储区,在这种情况下a[2] = 'b'也许不会导致语法错误,但是会导致程序崩溃
如果标准允许你这样写,要么是标准有bug,要么编译器不完全符合标准。然而在实际生产中,是否符合标准不是最重要的,程序不崩溃才是最重要的,因此如果编译器不支持标准某个特殊规定,那么标准就不能使用。</Entry><Entry KeyWord="replication 查找 articles(2011)" ActionWord=" " Tipo="1" Flag="0">
use distribution
go
select pub.publication,pub.publisher_db,art.article from dbo.MSpublications pub WITH (NOLOCK)
inner join dbo.MSarticles art WITH (NOLOCK)
on pub.publication_id=art.publication_id
where
publication like '%Rp_CUSTOMER_NEWSQL2.DATACACHE_01%'
</Entry><Entry KeyWord="&lt;winsock2.h&gt;与&lt;windows.h&gt; (2011)" ActionWord=" " Tipo="1" Flag="0">有关同时包含<winsock2.h>与<windows.h>头文件的问题
推荐
最近发现winsock2.h头文件与windows.h头文件在同时包含的时候会有问题,编译时会产生很多类型重复定义的错误。分析一下 winsock.h、winsock2.h和windows.h三个头文件,可以发现:要解决这个问题,需要首先包含winsock2.h,然后再包括 windows.h,要注意包含的顺序。
在Windows.h中,包含了winsock.h(winsock.h支持socket 1.1)。因此首先包含windows.h,然后再包含winsock2.h,显然会出现问题。</Entry><Entry KeyWord="#pragma comment(lib, &quot;Ws2_32.lib &quot;) (2011)" ActionWord=" " Tipo="1" Flag="0">#pragma comment 的用法实在是太多了,可以告诉你的是
#pragma comment(lib, "Ws2_32.lib ")表示链接Ws2_32.lib这个库。
和在工程设置里写上链入Ws2_32.lib的效果一样,不过这种方法写的
程序别人在使用你的代码的时候就不用再设置工程settings了。</Entry><Entry KeyWord="socket send (2011)" ActionWord=" " Tipo="1" Flag="0">#include "stdafx.h"
#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#pragma comment(lib, "WS2_32.lib")
#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT 27015
int main() {
//----------------------
// Declare and initialize variables.
int iResult;
WSADATA wsaData;
SOCKET ConnectSocket;
struct sockaddr_in clientService;
int recvbuflen = DEFAULT_BUFLEN;
char *sendbuf = "Client: sending data test";
char recvbuf[DEFAULT_BUFLEN] = "";
//----------------------
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR) {
printf("WSAStartup failed with error: %d\n", iResult);
return 1;
}
//----------------------
// Create a SOCKET for connecting to server
ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ConnectSocket == INVALID_SOCKET) {
printf("socket failed with error: %ld\n", WSAGetLastError());
WSACleanup();
return 1;
}
//----------------------
// The sockaddr_in structure specifies the address family,
// IP address, and port of the server to be connected to.
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );
clientService.sin_port = htons( DEFAULT_PORT );
//----------------------
// Connect to server.
iResult = connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) );
if (iResult == SOCKET_ERROR) {
printf( "connect failed with error: %d\n", WSAGetLastError() );
closesocket(ConnectSocket);
WSACleanup();
return 1;
}
//----------------------
// Send an initial buffer
iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );
if (iResult == SOCKET_ERROR) {
printf("send() failed with error: %d\n", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
return 1;
}
printf("Bytes Sent: %d\n", iResult);
// shutdown the connection since no more data will be sent
iResult = shutdown(ConnectSocket, SD_SEND);
if (iResult == SOCKET_ERROR) {
printf("shutdown failed with error: %d\n", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
return 1;
}
// Receive until the peer closes the connection
do {
iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
if ( iResult > 0 )
printf("Bytes received: %d\n", iResult);
else if ( iResult == 0 )
printf("Connection closed\n");
else
printf("recv failed with error: %d\n", WSAGetLastError());
} while( iResult > 0 );
// cleanup
closesocket(ConnectSocket);
WSACleanup();
return 0;
}
</Entry><Entry KeyWord="随机查询一条数据newid(2011)" ActionWord=" " Tipo="1" Flag="0">select IPADDRESS,ShippingAddress1, ShippingState,ShippingZipCode,ShippingCity, bBillingCity,bBillingAddress1,bBillingZipCode,bBillingState from NHISSLS.dbo.View3YN_SOMaster with(nolock) where sonumber = (SELECT top 1 sonumber from NHISSLS.dbo.View3YN_SOMaster with(nolock) order by newid())
</Entry><Entry KeyWord="resource view Opened in another editor (2011)" ActionWord=" " Tipo="1" Flag="0">VC2005 无法打开Resource View.提示Opened in another editor ?????
今天我也遇到了这个问题,在网上搜索了很多,说得都不是很清楚。最后还是我自己解决问题的。
方法是:打开VC2005,然后在工程编辑器(那个最主要的我们编写代码的窗口)把所有打开的文件关闭,让它变成一个空窗口。
然后再去点击RESOURCE VIEW的树状图。它就可以打开了。</Entry><Entry KeyWord="user deny 权限(2011)" ActionWord=" " Tipo="1" Flag="0">
use @@database
declare @purview varchar(200)
declare @tableName varchar(200)
set @tableName='dbo.arinvt01'
set @purview=' delete ,insert,alter '
set nocount on
create table #RoleMember
(DBRole varchar(100),
MemberName varchar(100),
MemberSid varbinary(2048))
insert into #RoleMember
exec sp_helprolemember
select DBRole,MemberName from #RoleMember
where DBRole not like '%msrepl%'
and MemberName not in ('CDDBA','dbo','MonDbo','RepDbo')
declare @Sql varchar(8000)
set @Sql='use '+db_name() +CHAR(10)+CHAR(10)
declare @memberName varchar(200)
DECLARE DATA_CURSOR CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
select MemberName from #RoleMember
where DBRole not like '%msrepl%'
and MemberName not in ('CDDBA','dbo','MonDbo','RepDbo')
OPEN DATA_CURSOR
FETCH NEXT FROM DATA_CURSOR INTO @memberName
WHILE @@FETCH_STATUS = 0
BEGIN
set @Sql+='deny '+@purview+' on OBJECT::'+@tableName+' to '+@memberName+CHAR(10)
FETCH NEXT FROM DATA_CURSOR INTO @memberName
end
CLOSE DATA_CURSOR
DEALLOCATE DATA_CURSOR
drop table #RoleMember
print @sql
--exec sp_helprolemember</Entry><Entry KeyWord="SetWindowRedraw(2011)" ActionWord=" " Tipo="1" Flag="0">Speeding up adding items to a combobox or listbox
Just a little tip: If you're going to be adding a lot of items to a listbox or combobox, there are a few little things you can do to improve the performance significantly. (Note: The improvements work only if you have a lot of items, like hundreds. Of course, the usability of a listbox with a hundred items is questionable, but I'm assuming you have a really good reason for doing this.)
First, you can disable redraw while you add the items. (This tip works for all controls, actually.)
SetWindowRedraw(hwnd, FALSE);
... add the items ...
SetWindowRedraw(hwnd, TRUE);
InvalidateRect(hwnd, NULL, TRUE);</Entry><Entry KeyWord="combobox (2011)" ActionWord=" " Tipo="1" Flag="0">
void Ctest22Dlg::OnBnClickedOk()
{
m_listBox1.AddString("1");
m_listBox1.AddString("2");
m_listBox1.AddString("3");
//设置下拉框宽度,图形界面设置下拉框高度
m_listBox1.SetDroppedWidth(100);
//m_listBox1.Set(100);
int nCount = m_listBox1.GetCount();
CString strText(_T(""));
for(int i=0; i<nCount; i++)
{
m_listBox1.GetLBText(i, strText);
m_listBox2.AddString(strText);
}
CComboBox *cbb;
cbb=&m_listBox1;
SetDropDownHeight(cbb,2);
}
//程序设置下拉框高度
void SetDropDownHeight(CComboBox* pMyComboBox, int itemsToShow)
{
//Get rectangles
CRect rctComboBox, rctDropDown;
pMyComboBox->GetClientRect(&rctComboBox); //Combo rect
pMyComboBox->GetDroppedControlRect(&rctDropDown); //DropDownList rect
int itemHeight = pMyComboBox->GetItemHeight(-1); //Get Item height
pMyComboBox->GetParent()->ScreenToClient(&rctDropDown); //Converts coordinates
rctDropDown.bottom = rctDropDown.top + rctComboBox.Height() + itemHeight*itemsToShow; //Set height
pMyComboBox->MoveWindow(&rctDropDown); //enable changes
}</Entry><Entry KeyWord="c++ 读文件 read file(2011)" ActionWord=" " Tipo="1" Flag="0">
void Ctest22Dlg::OnBnClickedCancel22()
{
StdioFile file;
file.Open("C:\\Temp\\123.txt",CFile::modeRead);
CString strLine(_T(""));
CString strText(_T(""));
int k=file.GetLength();
while(file.ReadString(strLine))
{
strText += strLine + _T("\r\n");
}
file.Close();
}
</Entry><Entry KeyWord="C++ JMP $+2 延时(2011)" ActionWord=" " Tipo="1" Flag="0">JMP 这个指令是占2个字节的吧,$+2就是当前指令的下一个指令,上网上搜了一些,JMP $+2主要用在端口出入输出上面,主要是延迟的功能给外设反映的时间,也就是延迟了一个指令的执行,但是不太好用,谢谢各位~~~!!</Entry><Entry KeyWord="linux 常用命令(2011)" ActionWord=" " Tipo="1" Flag="0">1.vi 建立文件
保存文件
如果是用vi编辑的话,在Insert状态下先按ESC,再输入冒号(:),再输入wq(保存退出)就可以了
2.clear 清屏
3.useradd 添加用户
passwd username 设置密码
userdel username 删除用户
groupadd groupname 添加组
groupdel 删除组
4.mkdir dir 创建目录
rmdir dir 删除目录
pwd 显示工作目录
ls -a 显示所有文件包括.开头文件
ls -l 以长列表显示
5.
cd 进入登陆目录
cd / 进入根目录
cd .. 上一级目录
cd /home 进入系统的home目录
cd home 进入当前目录下home目录
mv dirold dirnew 重命名目录
cp sourceDir targetDir 拷贝目录
6.
vi filename & touch filename 创建文件
rm filename 删除文件
mv sourFile TargetFile 重命名文件
cp sourFile targetFile 拷贝文件
ln -s sourceFile TargetFile 创建文件链接
7.
more FileName 一次显示一屏文件内容
cat FileName 一次显示全部文件内容
cat file1 file2>file3 将file1和file2内容写到file3中,覆盖
cat file1>>file2 将file1的内容追加到file2
grep "123" test.txt 在test文件中查找字符串“”
8.文件类型
- 普通文件
| link文件
d 目录
p 命名管道文件
b 块设备文件
9.
文件权限rwx(u(user 文件的属主),g(group 文件的属主的组),o(other 其他用户))
chmod a-x 123.txt (收回所有用户执行权限)
chmod go+w 123.txt (赋予组用户和其他用户的写权限)
chmod a= 123.txt (清除所有权限)
chmod 666 123.txt (赋予所有用户读写的权限)
10.
chown yind 123.txt 改变文件或目录的属主
chgrp grp 123.txt 改文件或目录的属组
chown yind:grp 123.txt 改变文件的属主和属组</Entry><Entry KeyWord="trigger (2011)监控表数据变化" ActionWord=" " Tipo="1" Flag="0">
-- trigger sample
ALTER TRIGGER [dbo].[TR_All_Monitor_Newegg_SoMaster]
ON [dbo].[NewEgg_SOMaster]
FOR UPDATE, INSERT, DELETE
AS
SET NOCOUNT ON;
INSERT dbo._MarkDelete_20090728_So(
event_type, parameter, sql)
EXEC(N'DBCC INPUTBUFFER(@@SPID)');
</Entry><Entry KeyWord="hosts文件(2011)" ActionWord=" " Tipo="1" Flag="0">
C:\WINDOWS\system32\drivers\etc</Entry><Entry KeyWord="xml * 的用法与unicode(2011)" ActionWord=" " Tipo="1" Flag="0">
declare @xml xml
--------------------生成xml-----------
;WITH XMLNAMESPACES(DEFAULT 'http://www.mysuhect.com/namespace')
select @xml=
(
SELECT
'MySubject' AS "Subject"
,'http://www.mysuhect.com/FromService' AS "FromService"
,'http://www.mysuhect.com/ToService' AS "ToService"
,[Node] =
(SELECT 'AddItem' AS "Action"
,'cc' AS "Comment"
,'NESO' AS "Sender"
,'EN' AS "Languag"
,'联想' AS "CompanyCode"
,'1.0' AS "Version"
FOR XML PATH('Message'),TYPE
)
,[Node] =
(SELECT 'DeleteItem' AS "Action"
,'tttttt' AS "Comment"
,'NESO' AS "Sender"
,'EN' AS "Languag"
,N'联想' AS "CompanyCode"
,'1.0' AS "Version"
FOR XML PATH('Message'),TYPE
)
FOR XML PATH ('MyProject'),TYPE
)
--select @xml as 生成
;WITH XMLNAMESPACES(DEFAULT 'http://www.mysuhect.com/namespace')
sELECT T.c.query(N'(./Message/*)')
FROM @xml.nodes('/MyProject/Node') T(c)
;WITH XMLNAMESPACES(DEFAULT 'http://www.mysuhect.com/namespace')
sELECT T.c.query(N'(./Message)')
FROM @xml.nodes('/MyProject/Node') T(c)
</Entry><Entry KeyWord="xml replace insert 空节点(2011)" ActionWord=" " Tipo="1" Flag="0">
declare @xml xml
set @xml = '<root><test></test></root>'
--replace 不能替换空节点
set @xml.modify('replace value of (/root/test/text())[1] with "testnew value"')
select @xml
-- 如果节点为空,插入
set @xml.modify('insert text{ "test new value"} into (/root/test[not(text())])[1]')
select @xml
---replace 可以替换空节点
set @xml.modify('replace value of (/root/test/text())[1] with "replace new value"')
select @xml
set @xml.modify('insert text{ "test new value"} into (/root/test[not(text())])[1]')
select @xml</Entry><Entry KeyWord="index 碎片查询(2011)" ActionWord=" " Tipo="1" Flag="0">USE ItemMaintain;
GO
SELECT * FROM sys.dm_db_index_physical_stats
(DB_ID(N'ItemMaintain'), OBJECT_ID(N'InventoryTransaction'), NULL, NULL , null);
GO
</Entry><Entry KeyWord="user 用户有的权限(2011)" ActionWord=" " Tipo="1" Flag="0">select object_name(id) obj,
(case [action] when 26 then 'REFERENCES'
when 178 then 'CREATE FUNCTION'
when 193 then 'SELECT'
when 195 then 'INSERT'
when 196 then 'DELETE'
when 197 then 'UPDATE'
when 198 then 'CREATE TABLE'
when 203 then 'CREATE DATABASE'
when 207 then 'CREATE VIEW'
when 222 then 'CREATE PROCEDURE'
when 224 then 'EXECUTE'
when 228 then 'BACKUP DATABASE'
when 233 then 'CREATE DEFAULT'
when 235 then 'BACKUP LOG'
when 236 then 'CREATE RULE' end) perm
from sysprotects where [uid]=user_id()</Entry><Entry KeyWord="Saving changes is not permitted 不能保存(2011)" ActionWord=" " Tipo="1" Flag="0">
This dialog states: "Saving changes is not permitted.
The changes you have made require the following tables to be dropped and re-created.
You have either made changes to a table that can't be re-created or enabled the option
Prevent saving changes that require the table to be re-created."
So what you want to do to configure the setting with the value you want (IMHO should be the default setting!).
Go to: Tools > Options
Select the tab Designers and choose Tables and designers
And uncheck the option: "Prevent saving changes that require table re-creation".
Once you now save changes it will work.
</Entry><Entry KeyWord="errorlog(2011)" ActionWord=" " Tipo="1" Flag="0">1. On the Start menu, point to All Programs, point to Microsoft SQL Server 2005, point to Configuration Tools, and then click SQL Server Configuration Manager.
2. In SQL Server Configuration Manager, expand Services, and then click SQL Server
3. In the details pane, right-click the name of the instance you want to start automatically, and then click Properties
4. Click the Advanced tab, and Verify Startup Parameters. </Entry><Entry KeyWord="TRANSACTION ISOLATION LEVEL (2011)" ActionWord=" " Tipo="1" Flag="0">
READ UNCOMMITTED 脏读
READ COMMITTED 提交读
REPEATABLE READ 重复读(其他事务不能update数据,当前选择的数据)
SERIALIZABLE 串行读(其他事务,不能insert当前查询条件的数据)
SNAPSHOT 保持数据一致(不影响其他事务提交修改。)
USE TEST;
GO
--SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
--SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
--SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
---可重复读隔离级别
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN TRANSACTION;
SELECT *
FROM tb where id<10;
COMMIT TRANSACTION;
GO
----第个线程
---处于阻塞状态
use TEST
go
update tb set name='sss' where id=3
</Entry><Entry KeyWord="xml local-name()(2011)" ActionWord=" " Tipo="1" Flag="0">
declare @message xml
set @message=
'
<Publish xmlns="http://soa.newegg.com/SOA/USA/InfrastructureService/V10/PubSubService">
<Subject>MySubject</Subject>
<FromService>http://www.mysuhect.com/FromService</FromService>
<ToService>http://www.mysuhect.com/ToService</ToService>
<Node>
<Action>AddItem</Action>
<Case>222222</Case>
<Body>
<ScanSerialNumber Action="ddddd"><tt>bbcc</tt></ScanSerialNumber>
<ScanSerialNumber Action="ADD1"><tt>cc</tt></ScanSerialNumber>
<Sender>NESO</Sender>
<Languag>EN</Languag>
<CompanyCode>联想</CompanyCode>
</Body>
</Node>
</Publish>
'
SELECT @Message.query('
declare default element namespace "http://soa.newegg.com/SOA/USA/InfrastructureService/V10/PubSubService";
<Publish>
{/Publish/*[local-name()!="Node"]}
</Publish>
')
SELECT @Message.query('
declare default element namespace "http://soa.newegg.com/SOA/USA/InfrastructureService/V10/PubSubService";
<Publish>
{/Publish/*[local-name()!="Node"]}
<Node>
{/Publish/Node/*[local-name()!="Body"]}
</Node>
</Publish>
') </Entry><Entry KeyWord="CURSOR 多次申明(2011)" ActionWord=" " Tipo="1" Flag="0">USE paymentcenter
GO
/*==========================================================
Server: PMCSQL
DataBase: PaymentCenter
Author: caff
ProcName: dbo.Up_PMT_PMC_ForJob_TransferPaymentTransaction
Version: 1.00
Date: 20070618
Content: Transfer to history
* Parameters
* --------------------------------------------------------
* Input : N/A
*
* Output : N/A
*
*
* Table Used :
* ---------------------------------------------------------
*
-----------------------------------------------------------
Modified history:
Date Modified by VER Description
------------------------------------------------------------
20070618 caff 1.00 create
20080912 jamebo 1.01 alter
20081227 thomas 1.02 alter(add ingrian column)
20100121 Zorro 1.03 save more information in transaction view
==========================================================*/
ALTER PROCEDURE dbo.Up_PMT_PMC_ForJob_TransferPaymentTransaction
@MaxTransactionId BIGINT
,@TransferCount INT
AS
BEGIN
SET XACT_ABORT ON
SET NOCOUNT ON
DECLARE @TransactionId BIGINT
DECLARE @Today DATETIME
SET @Today = CONVERT(DATETIME, CONVERT(CHAR(10), GETDATE(), 102))
IF @TransferCount > 0
BEGIN
IF @MaxTransactionId > 0
BEGIN
DECLARE data_cursor CURSOR
LOCAL
FORWARD_ONLY
STATIC
READ_ONLY
FOR
SELECT TOP
(@TransferCount) TransactionId
FROM dbo.PaymentTransaction WITH(NOLOCK)
WHERE
TransactionId < @MaxTransactionId
END ELSE BEGIN
DECLARE data_cursor CURSOR
LOCAL
FORWARD_ONLY
STATIC
READ_ONLY
FOR
SELECT TOP
(@TransferCount) TransactionId
FROM dbo.PaymentTransaction WITH(NOLOCK)
WHERE
InDate < @Today-40
END
END ELSE BEGIN
IF @MaxTransactionId > 0
BEGIN
DECLARE data_cursor CURSOR
LOCAL
FORWARD_ONLY
STATIC
READ_ONLY
FOR
SELECT
TransactionId
FROM dbo.PaymentTransaction WITH(NOLOCK)
WHERE
TransactionId < @MaxTransactionId
END ELSE BEGIN
DECLARE data_cursor CURSOR
LOCAL
FORWARD_ONLY
STATIC
READ_ONLY
FOR
SELECT
TransactionId
FROM dbo.PaymentTransaction WITH(NOLOCK)
WHERE
InDate < @Today-40
END
END
OPEN data_cursor
FETCH NEXT FROM data_cursor INTO @TransactionId
WHILE @@FETCH_STATUS = 0
BEGIN
IF EXISTS(
SELECT
TransactionId
FROM dbo.V_PaymentTransactionHistory WITH(NOLOCK)
WHERE
TransactionId = @TransactionId
)
BEGIN
DELETE
FROM dbo.PaymentTransaction
WHERE
TransactionId = @TransactionId
END
ELSE
BEGIN
BEGIN TRANSACTION
INSERT dbo.V_PaymentTransactionHistory
(
[TransactionId]
,[CombinedIdentity]
,[LocalMerchantId]
,[MerchantId]
,[DivisionNumber]
,[MerchantOrderNumber]
,[AccountNumberMasked]
,[AccountNumberEncrypted]
,[CvNumberEncrypted]
,[ExpireDate]
,[Amount]
,[Currency]
,[CardType]
,[SettleType]
,[SettledAmount]
,[Status]
,[InDate]
,[CreateDate]
,[AuthorizedDate]
,[LastRequestDate]
,[LastSettleDate]
,[VoidedDate]
,[Expired]
,[CurrencyISOCode]
,IngrianCardNumber
,HashCardNumber
,GatewayReasonCode
,GatewayApproveDate
,GatewayApproveCode
,GatewayAVSCode
,GatewayCAVVCode
,GatewayCVV2Code
,MappedRefNumber
,MerchantCustomerNumber
,MerchantOrderNumber2
,RefundAmount
,AvsCode
)
SELECT
[TransactionId]
,RTRIM([CombinedIdentity])
,RTRIM([LocalMerchantId])
,RTRIM([MerchantId])
,RTRIM([DivisionNumber])
,RTRIM([MerchantOrderNumber])
,RTRIM([AccountNumberMasked])
,RTRIM([AccountNumberEncrypted])
,RTRIM([CvNumberEncrypted])
,RTRIM([ExpireDate])
,[Amount]
,RTRIM([Currency])
,RTRIM([CardType])
,[SettleType]
,[SettledAmount]
,[Status]
,[InDate]
,[CreateDate]
,[AuthorizedDate]
,[LastRequestDate]
,[LastSettleDate]
,[VoidedDate]
,[Expired]
,[CurrencyISOCode]
,IngrianCardNumber
,HashCardNumber
,GatewayReasonCode
,GatewayApproveDate
,GatewayApproveCode
,GatewayAVSCode
,GatewayCAVVCode
,GatewayCVV2Code
,MappedRefNumber
,MerchantCustomerNumber
,MerchantOrderNumber2
,RefundAmount
,AvsCode
FROM [dbo].[PaymentTransaction] WITH(NOLOCK)
WHERE
TransactionId = @TransactionId
DELETE
FROM dbo.PaymentTransaction
WHERE
TransactionId = @TransactionId
COMMIT TRANSACTION
END
FETCH NEXT FROM data_cursor INTO @TransactionId
END
CLOSE data_cursor
DEALLOCATE data_cursor
END
GO</Entry><Entry KeyWord="primary key 查找主键列(2011)" ActionWord=" " Tipo="1" Flag="0">
sp_pkeys EDI832</Entry><Entry KeyWord="replication 修复数据(2011)" ActionWord=" " Tipo="1" Flag="0">--{CALL [dbo].[sp_MSupd_dboItemDescription] (,,,,,'<LongDescription Name="Detailed Specifications"><Group GroupName="Spec"><Property Key="Version" Value="General"/><Property Key="Operating Systems Supported" Value="Mac OS"/></Group></LongDescription>',2011-04-01 02:03:31.150,,,,,,,,,,,,,,NULL,,,,,,,,
--'00X-000A-00001 ',0x60001000)}
use distribution
go
exec sp_browsereplcmds '0x0000070300001D0A001500000000','0x0000070300001D0A001500000000'
go
declare @SourceServer nvarchar(255)
declare @SourceDB nvarchar(255)
declare @article nvarchar(255)
declare @TargetServer nvarchar(255)
declare @targetDB nvarchar(255)
set @TargetServer='s5rmadb01'
set @targetDB=''
set @SourceServer=''
set @SourceDB='codecenter'
set @article='ItemDescription'
set nocount on
if isnull(@targetDB,'')=''
set @targetDB=@SourceDB
if object_id('tempdb.dbo.#t') is not null
drop table #t
create table #t(tb_database nvarchar(255),
tb_owner nvarchar(255),tb_name nvarchar(255),
colname nvarchar(255),keyID int,
pk_name nvarchar(255))
declare @sql nvarchar(max)
set @sql=
N'use '+ @SourceDB +'
insert into #t
exec sp_pkeys '+@article +'
select * from #t
'
exec (@sql)
declare @filter nvarchar(200)
set @sql='use '+@SourceDB+CHAR(10)+
'select @filter=isnull(''and S.''+ convert(nvarchar(4000),art.filter_clause) ,'''')from dbo.sysarticles art
inner join dbo.syssubscriptions sub
on sub.artid=art.artid
where charindex('''+@TargetServer+''', srvname)>0
and art.name='''+@article+''''
--print @sql
exec sp_executesql @sql,N'@filter nvarchar(200) output',@filter=@filter output
--select @filter
--select * from #t
declare @conditon nvarchar(500)
set @conditon=stuff((select 'and S.'+colname+'=T.'+colname+' ' from #t for xml path('')),1,3,'')
declare @conditonIn nvarchar(500)
set @conditonIn=stuff((select 'and S.'+colname+'= ' from #t for xml path('')),1,3,'')
if(isnull(@TargetServer,'')<>'')
set @SourceServer=null
else
set @TargetServer=null
set @sql=
N'
--------need insert or delete data
insert into '+isnull(@TargetServer+'.','')+@targetDB+'.dbo.'+@article++CHAR(10)+
'select * from '+isnull(@SourceServer+'.','')+@SourceDB+'.dbo.'+@article+' S'+
CHAR(10)+'where '+@conditonIn+''+CHAR(10)+CHAR(10)+CHAR(10)+CHAR(10)
print @sql
set @sql=
N'
-----data different
select COUNT(*) from '+isnull(@SourceServer+'.','')+@SourceDB+'.dbo.'+@article+' S '+
'where (1=1 '+@filter+' ) and not exists
(
select * from '+isnull(@TargetServer+'.','')+@targetDB+'.dbo.'+@article+' T '+
'where '+@conditon+CHAR(10)+
')'+CHAR(10)+CHAR(10)+CHAR(10)+CHAR(10)
print @sql
set @sql=
N'
----insert into data
while 1=1
begin
insert into '+isnull(@TargetServer+'.','')+@targetDB+'.dbo.'+@article+CHAR(10)+
'select top 500 * from '+isnull(@SourceServer+'.','')+@SourceDB+'.dbo.'+@article+' S '+
'where (1=1 '+@filter+' ) and not exists
(
select * from '+isnull(@TargetServer+'.','')+@targetDB+'.dbo.'+@article+' T '+
'where '+@conditon+CHAR(10)+
')
if @@rowcount<500
break;
waitfor delay ''00:00:01''
end
'
print @sql
</Entry><Entry KeyWord="grant 授权用户对所有库的访问权限(2011)" ActionWord=" " Tipo="1" Flag="0">use master
go
set nocount on
declare @user_name sysname
,@password nvarchar(12)
select @user_name='tess'
,@password=N'123'
declare @database_Name sysname
,@sql nvarchar(max)
set @sql=N'if not exists(select top 1 1 from sys.syslogins with (nolock)
where name='''+@user_name+''')'+char(10)
+'create login '+@user_name+' with password='''+@password+''''+',CHECK_POLICY = OFF'+CHAR(10)
print @sql
--exec sp_executesql @sql
DECLARE Cur_dbName CURSOR LOCAL STATIC FORWARD_ONLY READ_ONLY
FOR
select name
from sys.sysdatabases with (nolock)
where name not in ('master','msdb','tempdb','model','distribution','SSB')
and status&512<>512--判断数据的状态为OffLine
OPEN Cur_dbName
FETCH NEXT FROM Cur_dbName INTO @database_Name
WHILE @@FETCH_STATUS=0
begin
set @sql=N''+CHAR(10)
set @sql=N'use '+@database_Name+'------数据库---------'+char(10)--+N'GO'+char(10)
+N'if exists (select top 1 1
from sys.sysusers with(nolock)
where name='''+@user_name+''')'+char(10)
+N'begin'+char(10)
+N'exec sp_change_users_login ''Update_One'','''+@user_name+''','''+@user_name+''''+char(10)
+N'end'+char(10)
+N'else'+char(10)
+N'begin'+char(10)
+N'create user '+@user_name+' for login '+@user_name+char(10)
+N'end'+char(10)
--+N'exec sp_addrolemember ''db_datareader'','+' '''+@user_name+''''+char(10)
+N'grant SELECT to '+@user_name++char(10)+char(10)
print @sql
--exec sp_executesql @sql
FETCH NEXT FROM Cur_dbName INTO @database_Name
end
CLOSE Cur_dbName
DEALLOCATE Cur_dbName
</Entry><Entry KeyWord="qurey replication_v2(2011)" ActionWord=" " Tipo="1" Flag="0">use distribution
go
select *,(select drop_publication as [*] FOR XML PATH ('root'),TYPE ) from
(
select p.publication, a.publisher_db,a.source_object,
ss.name,s.subscriber_db--,a.destination_object
,CHAR(10)+CHAR(10)+
'use '+p.publisher_db+CHAR(10)+' go'+CHAR(10)+
'EXEC sp_Dropsubscription @publication = N'''+p.publication+''''+CHAR(10)+
',@subscriber = N'''+ss.name+''''+CHAR(10)+
',@destination_db = N'''+Subscriber_DB+''''+CHAR(10)+
',@article = N'''+a.article+''''+CHAR(10)+
'EXEC sp_DropArticle @publication = N'''+p.publication+''''+CHAR(10)+
',@article = N'''+a.article+''''+CHAR(10)+CHAR(10)
as drop_publication
from dbo.MSsubscriptions s
inner join dbo.MSarticles a
on s.article_id=a.article_id and
s.publication_id=a.publication_id
inner join dbo.MSpublications p
on s.publication_id=p.publication_id
inner join sys.servers ss
on s.subscriber_id=ss.server_id
where
a.article='EC_VideoMaster'
)c
</Entry><Entry KeyWord="left join与inner join(2011)" ActionWord=" " Tipo="1" Flag="0">
---bydba 1,left join 1 和left join 2的结果不同,2和表达式相同
----(1)
select COUNT(*)
from Ecommerce2005.dbo.EDI_Seller_BasicInfo a WITH(NOLOCK)
left join Ecommerce2005.dbo.EDI_Seller_BasicInfo b WITH(NOLOCK)
on a.sellerid=b.sellerid
and b.shiptype=a.shiptype
and b.shiptype=2
----(2)
select COUNT(*)
from Ecommerce2005.dbo.EDI_Seller_BasicInfo a WITH(NOLOCK)
left join Ecommerce2005.dbo.EDI_Seller_BasicInfo b WITH(NOLOCK)
on a.sellerid=b.sellerid
and b.shiptype=a.shiptype
where b.shiptype=2
----(3)
select COUNT(*)
from Ecommerce2005.dbo.EDI_Seller_BasicInfo a WITH(NOLOCK)
inner join Ecommerce2005.dbo.EDI_Seller_BasicInfo b WITH(NOLOCK)
on a.sellerid=b.sellerid
and b.shiptype=a.shiptype
and b.shiptype=2</Entry><Entry KeyWord="miss index (2011)" ActionWord=" " Tipo="1" Flag="0">
SELECT TOP 10 *
FROM sys.dm_db_missing_index_group_stats
ORDER BY avg_total_user_cost * avg_user_impact * (user_seeks + user_scans)DESC;
SELECT migs.group_handle, mid.*
FROM sys.dm_db_missing_index_group_stats AS migs
INNER JOIN sys.dm_db_missing_index_groups AS mig
ON (migs.group_handle = mig.index_group_handle)
INNER JOIN sys.dm_db_missing_index_details AS mid
ON (mig.index_handle = mid.index_handle)
WHERE migs.group_handle = 1814;
</Entry><Entry KeyWord="job schedule enable&amp;disable(2011)" ActionWord=" " Tipo="1" Flag="0">DECLARE @job_name sysname
;
SET @job_name=N'Job_ItemMaintainNewegg_es.UP_EC_Batch_ImportData_Koala'
;
WITH JOB
AS
(
SELECT J.*,S.schedule_id
FROM msdb.dbo.sysjobs J WITH (NOLOCK)
,msdb.dbo.sysjobschedules S WITH (NOLOCK)
WHERE J.job_id=S.job_id
AND J.name=@job_name
)
,SCH
AS
(
SELECT job_sch_enable=
CASE S.enabled WHEN 0
THEN N'disable'
WHEN 1
THEN N'enable'
END
,JOB.*
FROM JOB,msdb.dbo.sysschedules S WITH (NOLOCK)
WHERE JOB.schedule_id=S.schedule_id
)
SELECT * FROM SCH
</Entry><Entry KeyWord="sp_configure 重新配置(2011)" ActionWord=" " Tipo="1" Flag="0">
exec sp_configure 'allow updates', 0;
reconfigure;
EXEC sp_configure 'max text repl size', 2147483647;
RECONFIGURE
</Entry><Entry KeyWord="rebuild index(2011)" ActionWord=" " Tipo="1" Flag="0">USE [master]
GO
/****** Object: StoredProcedure [dbo].[SP_DBAAutoIndex] Script Date: 03/26/2011 17:07:33 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[SP_DBAAutoIndex]
@database_name_list [nvarchar](max) = N'',
@table_name_list [nvarchar](max) = NULL
WITH EXECUTE AS CALLER
AS
SET NOCOUNT ON
--DECLARE
-- @database_name_list nvarchar(max),
-- @table_name_list nvarchar(max)
--SELECT
-- @database_name_list = N'dbaworker',
-- @table_name_list = NULL
SET NOCOUNT ON
BEGIN TRY
-- =================================================
-- prepare parameters
-- =================================================
DECLARE
@flag_edition int,
@flag_all_database bit,
@flag_all_table bit
SELECT
@database_name_list = CASE
WHEN @database_name_list = N'' THEN DB_NAME()
ELSE @database_name_list END,
@flag_edition = CASE
WHEN CONVERT(sysname, SERVERPROPERTY(N'Edition')) LIKE N'Enterprise%' THEN 1
ELSE 0
END,
@flag_all_database = CASE
WHEN @database_name_list > N'' THEN 0
ELSE 1 END,
@flag_all_table = CASE
WHEN @table_name_list > N'' THEN 0
ELSE 1 END
-- process database list
IF OBJECT_ID(N'tempdb..#db') IS NOT NULL
DROP TABLE #db
CREATE TABLE #db(
name sysname
PRIMARY KEY
WITH(
IGNORE_DUP_KEY = ON))
;WITH
DB AS(
SELECT
name = LTRIM(RTRIM(T.c.value('.[1]', 'sysname')))
FROM(
SELECT
database_name_list = CONVERT(xml,
N'<c><![CDATA['
+ REPLACE(@database_name_list, N',', N']]></c><c><![CDATA[')
+ N']]></c>')
)A
CROSS APPLY A.database_name_list.nodes('/c') T(c)
)
INSERT #db(
name)
SELECT
name
FROM sys.databases D WITH(NOLOCK)
WHERE (@flag_all_database = 1 AND name NOT IN(N'master', N'model', N'msdb', N'tempdb', N'distribution', N'temptable'))
OR EXISTS(
SELECT * FROM DB
WHERE name = D.name)
-- process table list
IF OBJECT_ID(N'tempdb..#tb') IS NOT NULL
DROP TABLE #tb
CREATE TABLE #tb(
name sysname
PRIMARY KEY
WITH(
IGNORE_DUP_KEY = ON))
IF @flag_all_table = 0
BEGIN
WITH
TB AS(
SELECT
name = LTRIM(RTRIM(T.c.value('.[1]', 'sysname')))
FROM(
SELECT
table_name_list = CONVERT(xml,
N'<c><![CDATA['
+ REPLACE(@table_name_list, N',', N']]></c><c><![CDATA[')
+ N']]></c>')
)A
CROSS APPLY A.table_name_list.nodes('/c') T(c)
)
INSERT #tb(
name)
SELECT
*
FROM tb
WHERE name > N''
END
-- =================================================
-- process on each database
-- =================================================
-- process script
DECLARE
@sql_index nvarchar(max)
SELECT
@sql_index = N'
DECLARE
@db_id int,
@db_name sysname,
@mode sysname
SELECT
@db_id = DB_ID(),
@db_name = DB_NAME(),
@mode = N''LIMITED''
-- fetch all index
DECLARE CUR_Index CURSOR LOCAL FORWARD_ONLY READ_ONLY STATIC
FOR
WITH
PT AS(
SELECT
object_id, index_id,
partition_count = COUNT (*)
FROM sys.partitions
GROUP BY object_id, index_id
),
COLMAX AS(
SELECT C.object_id
FROM sys.columns C WITH(NOLOCK), sys.types T
WHERE C.user_type_id = T.user_type_id
AND(
C.user_type_id IN(34, 35, 99)
OR (C.user_type_id IN(165, 167, 231, 241) AND C.max_length = -1))
)
SELECT
IX.object_id,
IX.index_id,
object_name = O.name,
schema_name = S.name,
index_name = IX.name,
partition_count = PT.partition_count,
allow_page_locks = IX.allow_page_locks,
has_maxcolumn = CASE
WHEN EXISTS(
SELECT * FROM COLMAX
WHERE object_id = IX.object_id)
THEN 1
ELSE 0 END
FROM sys.indexes IX WITH(NOLOCK)
INNER JOIN sys.objects O
ON IX.object_id = O.object_id
INNER JOIN sys.schemas S
ON S.schema_id = O.schema_id
INNER JOIN PT
ON IX.object_id = PT.object_id
AND IX.index_id = PT.index_id
WHERE O.is_ms_shipped = 0
AND O.name NOT LIKE N''%MarkDelete%''
AND IX.index_id > 0'
+ CASE
WHEN @flag_all_table = 1 THEN N''
ELSE N'
AND EXISTS(
SELECT * FROM #tb
WHERE name = O.name)
'
END
+ N'
DECLARE
@_log_recordid_index int,
@_log_recordid_defrage int,
@object_id int,
@index_id int,
@object_name sysname,
@schema_name sysname,
@index_name sysname,
@partition_count int,
@allow_page_locks bit,
@has_maxcolumn int
OPEN CUR_Index
FETCH CUR_Index INTO @object_id, @index_id, @object_name, @schema_name, @index_name, @partition_count, @allow_page_locks, @has_maxcolumn
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRY
-- record index process
SET @_log_recordid_index = NULL
INSERT TempTable.dbo.DBAIndexErrorLog(
DatabaseName, TableName, IndexName,
SQLCommand)
VALUES(
@db_name, QUOTENAME(@schema_name) + N''.'' + QUOTENAME(@object_name), @index_name,
N''sys.dm_db_index_physical_stats('' + RTRIM(@db_id) + N'', '' + RTRIM(@object_id) + N'', '' + RTRIM(@index_id) + N'', NULL, '''''' + RTRIM(@mode) + '''''')'')
SET @_log_recordid_index = SCOPE_IDENTITY()
-- =====================================
-- fetch single index to defrage
-- =====================================
DECLARE CUR_IndexSingle CURSOR LOCAL FORWARD_ONLY READ_ONLY STATIC
FOR
WITH
IDX AS(
SELECT
-- avg_fragmentation_in_percent,
-- partition_number
avg_fragmentation_in_percent = MAX(avg_fragmentation_in_percent)
FROM sys.dm_db_index_physical_stats(@db_id, @object_id, @index_id, NULL, @mode)
WHERE avg_fragmentation_in_percent > 5
)
SELECT
SQL = N''ALTER INDEX '' + QUOTENAME(@index_name)
+ N'' ON '' + QUOTENAME(@schema_name) + N''.'' + QUOTENAME(@object_name)
+ CASE
WHEN avg_fragmentation_in_percent < 7 AND @allow_page_locks = 1 THEN N'' REORGANIZE''
ELSE N'' REBUILD''
+ CASE
WHEN (@flag_edition = 1 AND @index_id > 1)
OR (@index_id = @flag_edition AND @has_maxcolumn = 0)
THEN N'' WITH(ONLINE = ON)''
ELSE N''''
END
END
-- + CASE
-- WHEN @partition_count > 0
-- THEN N'' PARTITION = '' + CONVERT(nvarchar(20), partition_number)
-- ELSE N''''
-- END
FROM IDX
DECLARE
@sql nvarchar(max)
OPEN CUR_IndexSingle
FETCH CUR_IndexSingle INTO @sql
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRY
-- record index defrage
SET @_log_recordid_defrage = NULL
INSERT TempTable.dbo.DBAIndexErrorLog(
DatabaseName, TableName, IndexName,
SQLCommand)
VALUES(
@db_name, QUOTENAME(@schema_name) + N''.'' + QUOTENAME(@object_name), @index_name,
@sql)
SET @_log_recordid_defrage = SCOPE_IDENTITY()
-- index defrage
-- PRINT(@sql)
EXEC sp_executesql @sql
-- update index defrage record
UPDATE A SET
FinishDate = GETDATE(),
ProcessFlag = 1
FROM TempTable.dbo.DBAIndexErrorLog A
WHERE IDENTITYCOL = @_log_recordid_defrage
UPDATE A SET
ProcessFlag = 1
FROM TempTable.dbo.DBAIndexErrorLog A
WHERE IDENTITYCOL < @_log_recordid_defrage
AND ErrorNumber <> 0
AND ProcessFlag = 0
AND DatabaseID = CHECKSUM(@db_name)
AND TableID = CHECKSUM(QUOTENAME(@schema_name) + N''.'' + QUOTENAME(@object_name))
AND IndexID = CHECKSUM(@index_name)
END TRY
BEGIN CATCH
-- record index defrage error
IF @_log_recordid_defrage IS NULL
INSERT TempTable.dbo.DBAIndexErrorLog(
DatabaseName, TableName, IndexName,
SQLCommand,
FinishDate, ErrorNumber, ErrorDescription)
VALUES(
@db_name, QUOTENAME(@schema_name) + N''.'' + QUOTENAME(@object_name), @index_name,
@sql,
GETDATE(), ERROR_NUMBER(), ERROR_MESSAGE())
ELSE
UPDATE A SET
FinishDate = GETDATE(),
ErrorNumber = ERROR_NUMBER(),
ErrorDescription = ERROR_MESSAGE()
FROM TempTable.dbo.DBAIndexErrorLog A
WHERE IDENTITYCOL = @_log_recordid_defrage
END CATCH
FETCH CUR_IndexSingle INTO @sql
END
CLOSE CUR_IndexSingle
DEALLOCATE CUR_IndexSingle
-- update index process record
UPDATE A SET
FinishDate = GETDATE(),
ProcessFlag = 1
FROM TempTable.dbo.DBAIndexErrorLog A
WHERE IDENTITYCOL = @_log_recordid_index
UPDATE A SET
ProcessFlag = 1
FROM TempTable.dbo.DBAIndexErrorLog A
WHERE IDENTITYCOL < @_log_recordid_index
AND ErrorNumber <> 0
AND ProcessFlag = 0
AND DatabaseID = CHECKSUM(@db_name)
AND TableID = CHECKSUM(QUOTENAME(@schema_name) + N''.'' + QUOTENAME(@object_name))
AND IndexID = CHECKSUM(@index_name)
END TRY
BEGIN CATCH
-- record index error
IF @_log_recordid_defrage IS NULL
INSERT TempTable.dbo.DBAIndexErrorLog(
DatabaseName, TableName, IndexName,
SQLCommand,
FinishDate, ErrorNumber, ErrorDescription)
VALUES(
@db_name, QUOTENAME(@schema_name) + N''.'' + QUOTENAME(@object_name), @index_name,
N''sys.dm_db_index_physical_stats('' + RTRIM(@db_id) + N'', '' + RTRIM(@object_id) + N'', '' + RTRIM(@index_id) + N'', NULL, '''''' + RTRIM(@mode) + '''''')'',
GETDATE(), ERROR_NUMBER(), ERROR_MESSAGE())
ELSE
UPDATE A SET
FinishDate = GETDATE(),
ErrorNumber = ERROR_NUMBER(),
ErrorDescription = ERROR_MESSAGE()
FROM TempTable.dbo.DBAIndexErrorLog A
WHERE IDENTITYCOL = @_log_recordid_index
END CATCH
FETCH CUR_Index INTO @object_id, @index_id, @object_name, @schema_name, @index_name, @partition_count, @allow_page_locks, @has_maxcolumn
END
CLOSE CUR_Index
DEALLOCATE CUR_Index
'
-- for each database
DECLARE CUR_db CURSOR LOCAL FORWARD_ONLY READ_ONLY STATIC
FOR
SELECT * FROM #db
DECLARE
@db_name sysname,
@sql nvarchar(max)
OPEN CUR_db
FETCH CUR_db INTO @db_name
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT
@sql = N'
USE ' + QUOTENAME(@db_name) + N'
RAISERROR(N''process on database "' + REPLACE(@db_name, N'''', N'''''') + N'"'', 10, 1) WITH NOWAIT
'
+ @sql_index
EXEC sp_executesql @sql,
N'
@flag_edition int
',
@flag_edition
FETCH CUR_db INTO @db_name
END
CLOSE CUR_db
DEALLOCATE CUR_db
END TRY
BEGIN CATCH
DECLARE
@ErrorMessage nvarchar(4000),
@ErrorNumber int,
@ErrorSeverity int,
@ErrorState int,
@ErrorLine int,
@ErrorProcedure nvarchar(200)
SELECT
@ErrorNumber = ERROR_NUMBER(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE(),
@ErrorLine = ERROR_LINE(),
@ErrorProcedure = ISNULL(ERROR_PROCEDURE(), '-'),
@ErrorMessage = ERROR_MESSAGE();
RAISERROR(
N'Error %d, Level %d, State %d, Procedure %s, Line %d, Message %s ',
@ErrorSeverity,
1,
@ErrorNumber,
@ErrorSeverity,
@ErrorState,
@ErrorProcedure,
@ErrorLine,
@ErrorMessage
)
END CATCH
GO
</Entry><Entry KeyWord="index rebuild jy85(2011)" ActionWord=" " Tipo="1" Flag="0">
SELECT * FROM sys.dm_db_index_physical_stats
(DB_ID(N'ItemMaintain'), OBJECT_ID(N'R_ItemL7DSVSummaryBySO'), NULL, NULL , null);
GO
select * from sys.indexes where
object_id=object_id('R_ItemL7DSVSummaryBySO')
go
ALTER INDEX IX_ItemNumber_CountryCode ON dbo.R_ItemL7DSVSummaryBySO REBUILD ;</Entry></Snippet>