您现在的位置是:网站首页> 数据库

SQLServer技术收集

摘要

SQLServer技术收集


1.jpg


数据库中的11种查询用法

MS SQL2008R2  监控

MSSQL问题解决收集

SQL Server调用的VC动态库

编写MSSQL调用的DLL

MSSQL操作JSON字符串

调试实际通过哟的GET请求函数

SQL Server存储过程模拟HTTP请求POST和GET协议

Sqlserver调用api

VC使用SQL-DMO接口控制SQL Server

MSSQL的命令行

with as 进行表的树查询

SQLSERVER一些公用DLL的作用解释

使用MSSQL  SDK实现数据同步

解决SQL Server发布订阅时需要有实际的服务器名称才能连接到服务器的问题

MSSQL数据库同步



数据库中的11种查询用法

一.简单查询

简单查询是最基本的查询类型,用于从数据库中选择特定列或所有列的数据。

SELECT 列名1, 列名2 FROM 表名;


二.条件查询

条件查询是使用WHERE子句来筛选满足特定条件的数据。通过指定条件,可以从数据库中检索满足要求的行。即带有WHERE子句的查询:

1.等于(=)操作符:

SELECT * FROM 表名 WHERE 列名 = 值;

该查询将返回列名等于给定值的行。


2.不等于(<>或!=)操作符:

SELECT * FROM 表名 WHERE 列名 <> 值;

该查询将返回不等于给定值的行。


3.大于(>)和小于(<)操作符:

SELECT * FROM 表名 WHERE 列名 > 值;

该查询将返回列名大于给定值的行。


4.大于等于(>=)和小于等于(<=)操作符:

SELECT * FROM 表名 WHERE 列名 <= 值;

该查询将返回列名小于等于给定值的行。



1. 在 FROM 子句中创建派生表:

SELECT t1.column1, t2.column2

FROM (SELECT column1, column2 FROM table1) AS t1

JOIN (SELECT column1, column2 FROM table2) AS t2

ON t1.column1 = t2.column1;

这个查询将嵌套查询 `(SELECT column1, column2 FROM table1)` 和 `(SELECT column1, column2 FROM table2)` 视为派生表 `t1` 和 `t2`,并通过连接它们来检索数据。


2. 在 SELECT 语句中使用嵌套查询:

SELECT column1, (SELECT MAX(column2) FROM table2) AS max_value

FROM table1;

这个查询返回 `table1` 表的每一行,以及从 `table2` 表中获取的最大值(计算列)。


3. 在 WHERE 子句中使用嵌套查询:

SELECT column1, column2

FROM table1

WHERE column1 IN (SELECT column1 FROM table2 WHERE condition);

这个查询检索 `table1` 表中满足嵌套查询条件的行。

要使用嵌套查询,只需要将内部查询放在外部查询的适当位置,并将其视为一个普通的表或数据源进行操作。嵌套查询的结果将作为外部查询的一部分来处理。



MS SQL2008R2  监控

使用X86

引用C:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies 

下的 

Microsoft.SqlServer.ConnectionInfo.dll

Microsoft.SqlServer.ConnectionInfoExtended.dll

代码

 try

            {

                ConnectionInfoBase conninfo = new SqlConnectionInfo();

                ((SqlConnectionInfo)conninfo).ServerName = "XN_PCWindow";

                ((SqlConnectionInfo)conninfo).UserName = "xn";

                ((SqlConnectionInfo)conninfo).Password = "123abc";

                ((SqlConnectionInfo)conninfo).DatabaseName = "xysys";

                ((SqlConnectionInfo)conninfo).UseIntegratedSecurity = true;


                TraceServer trace = new TraceServer();

                trace.InitializeAsReader(conninfo, "look.tdf");


                while (trace.Read())

                {

                    //Statements;

                    Console.WriteLine(trace["TextData"]);

                }

                Console.Read();

                trace.Close();

            }

            catch(Exception ex)

            {

                MessageBox.Show(ex.ToString());

            }

创建模板文件

1.png

1.png

列筛选器

1.png

点击“TextData”,输入2列值,比如我们现在只监视插入语句和更新语句,就输入%insert%,回车。再第二行输入“%update%”

1.jpg

导出look.tdf

1.png


MSSQL问题解决收集

[MSSQL]数据库展开报错:值不能为空或当MSSQL出现目录错误时

在目录C:\Users\Administrator\AppData\Local\Temp

下创建目录 

C:\Users\Administrator\AppData\Local\Temp\1

C:\Users\Administrator\AppData\Local\Temp\2

C:\Users\Administrator\AppData\Local\Temp\3



SQL Server调用的VC动态库

SQL Server调用的VC动态库.rar

DLL源码:

#include <stdafx.h>

#include "Winsock2.h"

#pragma comment   (lib,"ws2_32.lib")    

#define XP_NOERROR              0

#define XP_ERROR                1

#define MAXCOLNAME 25

#define MAXNAME 25

#define MAXTEXT 255


#ifdef __cplusplus

extern "C" {

#endif


RETCODE __declspec(dllexport) xp_Hello(SRV_PROC *srvproc);


#ifdef __cplusplus

}

#endif

void SendMsg(BYTE  *pData,int L)

{

//初始化SOCKET          

WSADATA         wsaData;          

    int iRet=WSAStartup(MAKEWORD(2,1),&wsaData);

SOCKET UDPSocket=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);

if(UDPSocket==INVALID_SOCKET)

{

return ;

}

sockaddr_in InternetAddr;

InternetAddr.sin_family=AF_INET;

InternetAddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

InternetAddr.sin_port=htons(7210);

if(bind(UDPSocket,

(PSOCKADDR )&InternetAddr,

sizeof(InternetAddr))==SOCKET_ERROR)

{

closesocket(UDPSocket);

UDPSocket=INVALID_SOCKET;

return ;

}


struct sockaddr addr;

memset(&addr,0,sizeof(struct sockaddr));

((sockaddr_in *)&addr)->sin_port=htons((short)5300);

((sockaddr_in *)&addr)->sin_family=AF_INET;

((sockaddr_in *)&addr)->sin_addr.S_un.S_addr=inet_addr("127.0.0.1");


sendto(UDPSocket,(char *)pData,L,0,&addr,sizeof(struct sockaddr));

closesocket(UDPSocket);

}

RETCODE __declspec(dllexport) xp_Hello(SRV_PROC *srvproc)

{


    DBSMALLINT i = 0;

    DBCHAR colname[MAXCOLNAME];

DBCHAR spName[MAXNAME];

DBCHAR spText[MAXTEXT];


// Name of this procedure

wsprintf(spName, "xp_Hello");

int         paramCount=srv_rpcparams(srvproc);

for(i=0;i<paramCount;i++)

{

BYTE    bType;          

unsigned long  cbMaxLen;          

unsigned long cbActualLen;          

BOOL   fNull;          

cbActualLen=srv_paramlen(srvproc,i+1);

BYTE *pData=new BYTE[cbActualLen+1];

memset(pData,0,cbActualLen+1);

        memcpy(pData,srv_paramdata(srvproc,i+1),cbActualLen);

int nDataType=srv_paramtype(

srvproc, 

i+1);


SendMsg(pData,cbActualLen);

delete[]pData;

}


//Send a text message

wsprintf(spText, "%s Sample Extended Stored Procedure", spName);

srv_sendmsg(

srvproc,

SRV_MSG_INFO,

0,

(DBTINYINT)0,

(DBTINYINT)0,

NULL,

0,

0,

spText,

SRV_NULLTERM);



//Set up the column names

    wsprintf(colname, "ID");

    srv_describe(srvproc, 1, colname, SRV_NULLTERM, SRVINT2, sizeof(DBSMALLINT), SRVINT2, sizeof(DBSMALLINT), 0);


    wsprintf(colname, "spName");

    srv_describe(srvproc, 2, colname, SRV_NULLTERM, SRVCHAR, MAXNAME, SRVCHAR, 0, NULL);


    wsprintf(colname, "Text");

    srv_describe(srvproc, 3, colname, SRV_NULLTERM, SRVCHAR, MAXTEXT, SRVCHAR, 0, NULL);



// Update field 2 "spName", same value for all rows

    srv_setcoldata(srvproc, 2, spName);

    srv_setcollen(srvproc, 2, strlen(spName));



// Send multiple rows of data

    for (i = 0; i < 3; i++) {


// Update field 1 "ID"

srv_setcoldata(srvproc, 1, &i);


// Update field 3 "Text"

wsprintf(spText, "%d) Sample rowset generated by the %s extended stored procedure", i, spName);


srv_setcoldata(srvproc, 3, spText);

        srv_setcollen(srvproc, 3, strlen(spText));


// Send the entire row

        srv_sendrow(srvproc);

    }


  

// Now return the number of rows processed

srv_senddone(srvproc, SRV_DONE_MORE | SRV_DONE_COUNT, (DBUSMALLINT)0, (DBINT)i);


return XP_NOERROR ;

}



实用:

在master中添加扩展存储过程

   sp_addextendedproc          'xp_Hello', 'd:\VCDll.dll'          

卸载的方法:          

   sp_dropextendedproc          'xp_Hello'


赋予扩展存储过程使用权限


在要用的库中加自定义函数

CREATE Function dbo.Hello

(

)

RETURNS int as

begin

EXEC master.dbo.xp_Hello  'Hello SQL Server'/*在函数里使用扩展存储过程*/

return 1

end



在要用的库中加存储过程


CREATE PROCEDURE xxx  AS

exec Hello /*调用函数*/

select * from systypes

GO


 

编写MSSQL调用的DLL

--开启clr功能

EXEC sp_configure 'show advanced options','1'; 

GO 

RECONFIGURE; 

GO 

EXEC sp_configure 'clr enabled','1' 

RECONFIGURE; 

GO 


--要改变的数据库

ALTER DATABASE [nodedb_003] SET TRUSTWORTHY ON 

GO 


--将dll文件添加到信任白名单

DECLARE @hash AS BINARY(64) = (SELECT HASHBYTES('SHA2_512', (SELECT * FROM OPENROWSET (BULK 'F:\2019LastCode\ASP.NET\MSSQLDll\MSSQLDll\bin\Release\MSSQLDll.dll', SINGLE_BLOB) AS [Data])))

EXEC sp_add_trusted_assembly @hash

go


--解决:在 master 数据库中记录的数据库所有者 SID 与在数据库 '**' 中记录的数据库所有者 SID 不同

sp_changedbowner 'sa',true


--创建程序集,【SQL_CLR_Decode】是创建的程序集名称,可以自定义

CREATE ASSEMBLY SQL_CLR_Decode

FROM 'F:\2019LastCode\ASP.NET\MSSQLDll\MSSQLDll\bin\Release\MSSQLDll.dll' 

WITH PERMISSION_SET = unSAFE 

GO


--创建函数

CREATE FUNCTION SqlDecode(@source_str NVARCHAR(4000)) 

RETURNS NVARCHAR(4000) 

AS 

--SQL_CLR_Decode是创建的程序集名称,DecodeCLR是程序集中命名空间的名称,CLRClass是类名,Decode是要调用的程序集中的方法名

EXTERNAL NAME SQL_CLR_Decode.[MSSQLDll.CLRClass].Decode 

GO




--调用函数

select dbo.SqlDecode('1Y3C1Y3Y')  




MSSQLDll源码 创建类库,版本.NET3.5


namespace MSSQLDll

{

    public class CLRClass

    {

        [Microsoft.SqlServer.Server.SqlMethod]

        public static string Decode(string source_str)

        {

            return "hello " + source_str;

        }

    }



MSSQL操作JSON字符串

Json 是一种流行的数据存储和传输格式,SQL Server 从 2016 版本开始,通过系统内置的 Json函数 编写 SQL 语句即可 处理 Json 数据,以及 生成 Json 数据

DECLARE @json NVARCHAR(MAX)

SET @json =   

  N'[  

       {  

         "Order": {  

           "Number":"SO43659",  

           "Date":"2011-05-31T00:00:00"  

         },  

         "AccountNumber":"AW29825",  

         "Item": {  

           "Price":2024.9940,  

           "Quantity":1  

         }  

       },  

       {  

         "Order": {  

           "Number":"SO43661",  

           "Date":"2011-06-01T00:00:00"  

         },  

         "AccountNumber":"AW73565",  

         "Item": {  

           "Price":2024.9940,  

           "Quantity":3  

         }  

      }  

 ]'  

   

SELECT * FROM  

 OPENJSON ( @json )  

WITH (   

              Number   varchar(200) '$.Order.Number' ,  

              Date     datetime     '$.Order.Date',  

              Customer varchar(200) '$.AccountNumber',  

              Quantity int          '$.Item.Quantity'  

 ) 

结果

Number Date 客户 数量
SO43659 2011-05-31T00:00:00 AW29825 1
SO43661 2011-06-01T00:00:00 AW73565 3

此函数返回 JSON 数组的元素并将其格式化。


调试实际通过哟的GET请求函数

USE [nodedb_003]

GO

/****** Object:  UserDefinedFunction [dbo].[GetWeb]    Script Date: 07/20/2023 21:26:16 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

ALTER FUNCTION [dbo].[GetWeb]

    @url nvarchar(100),

    @data nvarchar(500)

)

RETURNS nvarchar(4000) #特别主要有些字符串尽量定义好长度

AS

BEGIN

  

DECLARE @ErrMsg VARCHAR(5000)

DECLARE @token INT,@result INT,@returnTextErr VARCHAR(200),@HttpStatus VARCHAR(200)       

    

Declare @ResponseText AS  varchar(4000)

DECLARE @source varchar(max)

DECLARE @description varchar(max)



SET @ResponseText=''



EXECUTE @result =sp_OACreate 'Msxml2.ServerXMLHTTP.3.0', @token OUT

IF @result<>0

BEGIN

        EXECUTE sp_OAGetErrorInfo @token, @ErrMsg OUT, @returnTextErr OUT

        SET @ErrMsg = '初始化对象失败,' + @ErrMsg + ISNULL(@returnTextErr, '')

        RETURN @ErrMsg

END 


EXECUTE @result = sp_OAMethod @token, 'open', NULL, 'GET',@url,'false'

IF @result <> 0

BEGIN

        EXECUTE sp_OAGetErrorInfo @token, @ErrMsg OUT, @returnTextErr OUT

        SET @ErrMsg = '创建连接失败,' + @ErrMsg + ISNULL(@returnTextErr, '')

        RETURN @ErrMsg

END 




EXECUTE @result=sp_OAMethod @token, 'send', NULL, @data --发送数据

IF @result <> 0

BEGIN

        EXECUTE sp_OAGetErrorInfo @token, @ErrMsg OUT, @returnTextErr OUT

        SET @ErrMsg = '发送请求头失败,'+ @ErrMsg + ISNULL(@returnTextErr, '')

        RETURN @ErrMsg

END



EXECUTE @result = sys.sp_OAGetProperty @token, 'Status', @HttpStatus OUT   

IF @result <> 0

BEGIN

         EXECUTE sp_OAGetErrorInfo @token, @ErrMsg OUT, @returnTextErr OUT

        SET @ErrMsg = '读取[Status]属性值失败,'+ @ErrMsg + ISNULL(@returnTextErr,'')

        RETURN @ErrMsg

END



 IF @HttpStatus <> 200

 BEGIN

       SET @ErrMsg ='访问错误,http状态代码,'+ @HttpStatus +''

       RETURN @ErrMsg

 END


--EXECUTE @ResponseText =sp_OAGetProperty  @token, 'responseText'

--set @ResponseText='1111'




--Exec sp_OAMethod @token, 'responseText',@ResponseText OUT


EXEC @result= SP_OAGetProperty @token,'responseText',@ResponseText OUT;



IF @result <> 0

BEGIN

         EXECUTE sp_OAGetErrorInfo @token, @ErrMsg OUT, @returnTextErr OUT

        SET @ErrMsg = '读取[responseText]属性值失败,'+ @ErrMsg + ISNULL(@returnTextErr,'')

        EXEC sp_OADestroy @token

        RETURN @ErrMsg

END


--EXECUTE sp_OAGetErrorInfo @token,@source OUT, @description OUT --异常输出


--Select  @ResponseText 


EXEC sp_OADestroy @token

RETURN @ResponseText


END


SQL Server存储过程模拟HTTP请求POST和GET协议

/****** Object:  StoredProcedure [dbo].[sp_http_get]    Script Date: 05/23/2020 15:47:09 ******/

SET ANSI_NULLS ON

GO


SET QUOTED_IDENTIFIER ON

GO



CREATE PROCEDURE [dbo].[sp_http_get](

    @URL varchar(500),

    @ResponseText varchar(8000) OUTPUT

)

AS

BEGIN


Declare @Status as Int   

Exec sp_OACreate 'Msxml2.ServerXMLHTTP.3.0', @Status OUT;

Exec sp_OAMethod @Status, 'open', NULL, 'GET',@URL,'false'

Exec sp_OAMethod @Status, 'send', NULL, NULL

Exec sp_OAMethod @Status, 'responseText', @ResponseText OUTPUT

if @Status<>0

  begin

    EXEC sp_OAGetErrorInfo @Status

  end

Exec sp_OADestroy @Status

END


GO



CREATE PROCEDURE [dbo].[sp_http_post](

    @URL varchar(500),

    @Data varchar(8000),

    @ResponseText varchar(8000) OUTPUT

)

AS

BEGIN


Declare @Status as Int   

Exec sp_OACreate 'Msxml2.ServerXMLHTTP.3.0', @Status OUT;

Exec sp_OAMethod @Status, 'open', NULL, 'POST',@URL,'false'

Exec sp_OAMethod @Status, 'setRequestHeader', NULL, 'Content-Type','application/x-www-form-urlencoded'

Exec sp_OAMethod @Status, 'send', NULL, @Data

Exec sp_OAMethod @Status, 'responseText', @ResponseText OUTPUT

if @Status<>0

  begin

    EXEC sp_OAGetErrorInfo @Status

  end

Exec sp_OADestroy @Status

END



GO


Sqlserver调用api

一、首先要开启组件的配置


sp_configure 'show advanced options', 1;

GO

RECONFIGURE;

GO

sp_configure 'Ole Automation Procedures', 1;

GO

RECONFIGURE;

GO

EXEC sp_configure 'Ole Automation Procedures';

GO


二、调用webservice

1、使用sqlserver调用对应的接口以及结果


declare @ServiceUrl as varchar(1000) 

set @ServiceUrl = 'http://localhost:19930/LoginWebService.asmx/Login'

DECLARE @data varchar(max);

set @data='userid=1&phone=17647582259'                  


Declare @Object as Int

Declare @ResponseText AS  varchar(1000)   ;      

Exec sp_OACreate 'Msxml2.ServerXMLHTTP.3.0', @Object OUT;

Exec sp_OAMethod @Object, 'open', NULL, 'POST',@ServiceUrl,'false'

Exec sp_OAMethod @Object, 'setRequestHeader', NULL, 'Content-Type','application/x-www-form-urlencoded'

Exec sp_OAMethod @Object, 'send', NULL, @data --发送数据

Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT

EXEC sp_OAGetErrorInfo @Object --异常输出

Select  @ResponseText 

Exec sp_OADestroy @Object

GO


三、调用webapi

1、接口调用以及结果

GET操作


declare @ServiceUrl as varchar(1000) 

set @ServiceUrl = 'http://xxxxx.com/api?userid=6'

DECLARE @data varchar(max);

set @data=''                  


Declare @Object as Int

Declare @ResponseText AS  varchar(8000)   ;      

Exec sp_OACreate 'Msxml2.ServerXMLHTTP.3.0', @Object OUT;

Exec sp_OAMethod @Object, 'open', NULL, 'GET',@ServiceUrl,'false'

Exec sp_OAMethod @Object, 'send', NULL, @data --发送数据

Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT

EXEC sp_OAGetErrorInfo @Object --异常输出

Select  @ResponseText 

Exec sp_OADestroy @Object

GO


POST操作


declare @ServiceUrl as varchar(1000) 

set @ServiceUrl = 'http://xxx.com/webapi'

DECLARE @data varchar(max);

--发送数据

set @data='CityName=SubmitSystemName=%E7%99%BE%E5%BA%A6%E5%8F%8D%E9%A6%88&OriginID=2d90660c-436c-4e12-bfa6-e849a06b2c51&Price=10000&IsAccurate=False&PriceType=1&UserKeyId=a669e4ec7bdc47a7b6c2c334ebe1a50c&signature=X8p3lIZT0Ba3LeiC6irm3%2FMnlE8%3D&time=1452735047291'                   


Declare @Object as Int

Declare @ResponseText AS  varchar(8000)   ;      

Exec sp_OACreate 'Msxml2.ServerXMLHTTP.3.0', @Object OUT;

Exec sp_OAMethod @Object, 'open', NULL, 'POST',@ServiceUrl,'false'

Exec sp_OAMethod @Object, 'setRequestHeader', NULL, 'Content-Type','application/x-www-form-urlencoded'

Exec sp_OAMethod @Object, 'send', NULL, @data --发送数据

Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT

EXEC sp_OAGetErrorInfo @Object --异常输出

Select  @ResponseText 

Exec sp_OADestroy @Object

GO


四、存储过程


CREATE PROC P_Service 

@ServiceUrl varchar(1000),

@data varchar(max),

@GetOrPost varchar(100),

@HeadersKey varchar(200),

@HeadersValue varchar(200)

as


Declare @Object as Int

Declare @ResponseText AS  varchar(1000)   ;      

Exec sp_OACreate 'Msxml2.ServerXMLHTTP.3.0', @Object OUT;

Exec sp_OAMethod @Object, 'open', NULL, @GetOrPost,@ServiceUrl,'false'

Exec sp_OAMethod @Object, 'setRequestHeader', NULL, @HeadersKey,@HeadersValue

Exec sp_OAMethod @Object, 'send', NULL, @data --发送数据

Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT

--EXEC sp_OAGetErrorInfo @Object --异常输出

Select  @ResponseText 

Exec sp_OADestroy @Object

GO


VC使用SQL-DMO接口控制SQL Server

微软为外部程序的MS SQL Server服务访问提供了功能强大的COM接口,通过这些接口,可以不费吹灰之力就可以方便的访问SQL的服务。

  

  第一步:在MS SQL Server的安装目录下面找到在sqldmo.rll文件,然后

  

   #import "sqldmo.rll" no_namespace

  

  这样就生产了sqldmo.tlh和sqldmo.tli文件,里面包含了SQL的COM接口的定义和实现。

  

  第二步:就是具体的实现了。

  

  先来一个启动SQL Server服务

  

   BOOL StartSQLServer()

   {

   //先初始化COM

   if (FAILED(CoInitialize(NULL)))

   {

   AfxMessageBox("Com初始化错误!");

   return FALSE;

   }

   //定义一个SQL Server的对象指针

   _SQLServerPtr spSQLServer;

   //标准方法,建立实例

   if (FAILED(spSQLServer.CreateInstance(__uuidof(SQLServer))))

   {

   AfxMessageBox("无法建立SQL对象!");

   return FALSE;

   }

  

   try

   {

   //这里设置连接SQL的一些参数

   //简单。设置Login超时

   spSQLServer->PutLoginTimeout(10);

   //随便起个名字好啦,管不着我啦

   spSQLServer->PutApplicationName("MyAppName");

   spSQLServer->PutHostName("MyHostName");

   //网络数据Packet的大小

   spSQLServer->PutNetPacketSize(1024);

  

   CString strServer(”(Local)”);

   Cstring strUserName(“sa”); //连接启动的用户名,也可以使用信任连接,不用提供用户名和密码,请参考MSDN

   Cstring strPassword(””);//就是密码啦 spSQLServer->Connect(_variant_t(strServer),_variant_t(strUserName),_variant_t());

   }

   catch(_com_error pCE)

   {

   //连接错误啦,是服务器没有启动吧

   try

   {

   //真正启动SQL Server的代码在这里 spSQLServer->Start(FALSE,_variant_t(strServer),_variant_t(strUserName),_variant_t(strPassword)); }

   catch(_com_error pCE)

   {

   //这次的异常处理倒没有执行什么操作啊,随便处理一下,返回一个错误信息啦。

   AfxMessageBox(pCE.Description());

   spSQLServer.Release();

   return FALSE;

   }

   }

  

   //接下来是释放资源啦,try catch是不是用成习惯了,这样也要??反正是没有错的,多用一下也好啦。

   try

   {

   spSQLServer.Release();

   spSQLServer.Release();

   }

   catch(_com_error pCE)

   {

   AfxMessageBox(pCE.Description());

  

   return FALSE;

   }

  

   //释放COM

   CoUninitialize();

   return TRUE;

   }

  

  通过#import "sqldmo.rll"还能获得其他的很多接口,比如Attach数据库、FullTextService、获得设置SQL Server服务器的属性等等,当然相对应的停止SQL服务我就不用说了吧。



MSSQL的命令行

执行脚本文件

sqlcmd -S myServer\instanceName -i C:\myScript.sql


sqlcmd -S . -U sa -P 123456 -d test -i data.sql

参数说明:-S 服务器地址 -U 用户名 -P 密码 -d 数据库名称 -i 脚本文件路径

本地服务器地址可以写 ,也可写(local)或者IP地址



###其他sqlcmd所有功能

用法: Sqlcmd            [-U 登录 ID]          [-P 密码]

 [-S 服务器]            [-H 主机名]          [-E 可信连接]

 [-N 加密连接][-C 信任服务器证书]

 [-d 使用数据库名称] [-l 登录超时值]     [-t 查询超时值]

 [-h 标题]           [-s 列分隔符]      [-w 屏幕宽度]

 [-a 数据包大小]        [-e 回显输入]        [-I 允许带引号的

 [-c 命令结束]            [-L[c] 列出服务器[清除输出]]

 [-q "命令行查询"]   [-Q "命令行查询" 并退出]

 [-m 错误级别]        [-V 严重级别]     [-W 删除尾随空格]

 [-u unicode 输出]    [-r[0|1] 发送到 stderr 的消息]

 [-i 输入文件]         [-o 输出文件]        [-z 新密码]

 [-f <代码页> | i:<代码页>[,o:<代码页>]] [-Z 新建密码并退出]

 [-k[1|2] 删除[替换]控制字符]

 [-y 可变长度类型显示宽度]

 [-Y 固定长度类型显示宽度]

 [-p[1] 打印统计信息[冒号格式]]

 [-R 使用客户端区域设置]

 [-K 应用程序意向]

 [-M 多子网故障转移]

 [-b 出错时中止批处理]

 [-v 变量 = "值"...]  [-A 专用管理连接]

 [-X[1] 禁用命令、启动脚本、环境变量[并退出]]

 [-x 禁用变量替换]

 [-? 显示语法摘要]



with as 进行表的树查询

查阅相关资料,对于数性表结构的数据,生成的SQ可参考以下代码实现,为避免排版出现混乱,增加必要的文字进行填充

SQLString = "with temp(sys_js_uuid,jsname,parentjs_uuid,sys_companys_nodeuuid,ischild)";

SQLString += " as ";

SQLString += "(";

SQLString += "select sys_js_uuid,jsname,parentjs_uuid,sys_companys_nodeuuid,ischild ";

SQLString += " from  sys_js ";

SQLString += " where parentjs_uuid=" + m_SessionLink.sys_js_uuid + " and ischild=1";

SQLString += " union all ";

SQLString += "select a.sys_js_uuid,a.jsname,a.parentjs_uuid,a.sys_companys_nodeuuid,a.ischild ";

SQLString += " from sys_js a ";

SQLString += " inner join temp on a.parentjs_uuid=temp.sys_js_uuid and a.ischild=1";

SQLString += ")";

SQLString += "select * from temp where sys_companys_nodeuuid=0 or sys_companys_nodeuuid=" + sys_companys_nodeuuid;



SQLSERVER一些公用DLL的作用解释

SQLSERVER一些公用DLL的作用解释

扩展介绍

例子下载地址

解释例子

这些DLL有什么用??

这些DLL是供SQLSERVER调用的,因为这些公用DLL在SQLSERVER的很多组件中都有用到,所以SQLSERVER就把这些

DLL放到X:\Program Files\Microsoft SQL Server\X\SDK\Assemblies\文件夹下以供其他SQLSERVER组件调用

例如SSIS、SSAS、数据库引擎还有其他的工具

其实从文件夹路径名我们就可以知道这些DLL的作用:SDK\Assemblies\

大家不知道SDK的含义可以百度一下,不过可能大家比较赖,我就贴出来吧

SDK(Software Development Kit, 即软件开发工具包 )一般是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等

建立应用软件的开发工具的集合。

资深程序员一定知道SDK的作用,他就是某个软件提供给我们程序员用来开发的一些接口或者API

 

本人觉得X:\Program Files\Microsoft SQL Server\X\SDK\Assemblies\文件夹下面的这些DLL不只是提供给SQLSERVER调用的

我们也可以调用这些DLL来开发SQLSERVER数据库的一些相关软件和工具

 

例子一:

园子里的胡勇大侠就用了下面的两个DLL来做出了:   (喷血分享)利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句

Microsoft.SqlServer.ConnectionInfo.dll

Microsoft.SqlServer.Management.Sdk.Sfc.dll

例子二:

又例如这个帖子:用c#做了个,sqlServer2005里面那个事件监控器一样的程序,启动问题请帮看看

用Microsoft.SqlServer.ConnectionInfo.dll这个DLL做一个类似于SQL TRACE的工具出来,用来实时查看执行的脚本以及其他信息

例子三:

SQLDoc Sharp(SQLSERVER数据库文档生成工具)

这个工具在codeproject上可以下载:http://www.codeproject.com/Articles/35790/SQLDoc-Sharp

用到了下面的DLL

Microsoft.SqlServer.ConnectionInfo.dll

Microsoft.SqlServer.Management.Sdk.Sfc.dll

Microsoft.SqlServer.Smo.dll

Microsoft.SqlServer.SmoExtended.dll

Microsoft.SqlServer.SqlEnum.dll



使用MSSQL  SDK实现数据同步

主要使用了sql 2008 SDK的这两个动态库,

第一个:Microsoft.SqlServerConnectionInfoExtended.dll 

第二个:Microsoft.SqlServer.ConnectionInfo.dll

SQL2005是C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies


SQL2008才是C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies


SQL2012是:C:\Program Files\Microsoft SQL Server\110\SDK\Assemblies


我观察到SQL2005只有Microsoft.SqlServer.ConnectionInfo.dll DLL文件


而从SQL2008开始才有Microsoft.SqlServer.ConnectionInfoExtended.dll DLL文件



解决SQL Server发布订阅时需要有实际的服务器名称才能连接到服务器的问题

SQL Server 2008配置发布订阅时,报错:SQL Server 复制需要有实际的服务器名称才能连接到服务器,不支持通过别名、ip地址或其他任何备用名称进行连接。请指定实际的服务器名称“xxxx”(Replication Utlities)。" 

经过一番分析发现是在安装完sql server 后修改过机器名称,运行下面两条语句既可以看出来:

select @@servername

select serverproperty('servername') 

如果这两个结果不一致,说明机器改过名字,在配置复制的时候就会报上面的错误。 

--要修复此问题  

--执行下面的语句,完成后重新启动SQL服务 

if serverproperty('servername') <> @@servername

begin

declare @server sysname

set @server = @@servername

exec sp_dropserver @server = @server

set @server = cast(serverproperty('servername') as sysname)

exec sp_addserver @server = @server , @local = 'LOCAL'

End 

需注意的是,改过之后必须要重启一下SQL 服务器才可以,这时在用

select @@servernameselect serverproperty('servername')查看的结果是一样的,都是当前服务器的名字了。


MSSQL数据库同步

MSQL数据库同步

快照最好使用FTP快照,同步方式

选择发布类型,这里有四种:快照发布、事务发布、可更新订阅的事务发布、合并发布。快照发布和合并发布都是定期取数据,不同的是合并发布可独立更新,可把订阅端的数据更新同步到发布端;测试发现如果两端同时更新,发布端的更新会覆盖掉订阅端的更新。事务发布是事务驱动,只要有更新,立马同步更新






























Top