变相怪杰 发表于 2015-1-16 22:40:04

MSSQL网页编程之SQL Server 与 Excel

恢复到之前的某个状态,是需要数据的。这数据可以是a)回滚步骤或者b)操作之前的数据状态原文。excel|server
/*
存储历程称号:导出数据到Excel
功效形貌:导出数据到Excel

EXECExportToExcel@server=.,
@uname=sa,
@pwd=,
@QueryText=SELECT*FROMdldata..bbbbbb,
@filename=d:ImportToExcel.xls
*/

IFOBJECT_ID(ExportToExcel)ISNOTNULLDROPPROCExportToExcel
GO

CREATEPROCEDUREExportToExcel(
@serversysname=null,
@unamesysname=null,
@pwdsysname=null,
@QueryTextvarchar(200)=null,
@filenamevarchar(200)=d:ImportToExcel.xls
)
AS
DECLARE@SQLServerint,--SQLDMO.SQLServer工具
@QueryResultsint,--QueryResults工具
@CurrentResultSetint,
@objectint,--Excel.Application工具
@WorkBooksint,
@WorkBookint,
@Rangeint,
@hrint,
@Columnsint,
@Rowsint,
@indColumnint,
@indRowint,
@off_Columnint,
@off_Rowint,
@code_strvarchar(100),
@result_strvarchar(255)

IF@QueryTextISNULL
BEGIN
PRINTSetthequerystring
RETURN
END

--设置服务器名为当地服务器(@@servername前往运转SQLServer的当地服务器称号)
IF@serverISNULLSELECT@server=@@servername

--设置用户名为以后体系用户名(利用SYSTEM_USER前往以后体系用户名)
IF@unameISNULLSELECT@uname=SYSTEM_USER

SETNOCOUNTON

--创立SQLDMO.SQLServer工具
EXEC@hr=sp_OACreateSQLDMO.SQLServer,@SQLServerOUT
IF@hr0
BEGIN
PRINTerrorcreateSQLDMO.SQLServer
RETURN
END

--毗连到SQLServer体系
IF@pwdISNULL
BEGIN
EXEC@hr=sp_OAMethod@SQLServer,Connect,null,@server,@uname
IF@hr0
BEGIN
PRINTerrorConnect
RETURN
END
END
ELSE
BEGIN
EXEC@hr=sp_OAMethod@SQLServer,Connect,null,@server,@uname,@pwd
IF@hr0
BEGIN
PRINTerrorConnect
RETURN
END
END

--TheExecuteWithResultsmethodexecutesaTransact-SQLcommandbatch
--returningbatchresultsetsinaQueryResultsobject
SELECT@result_str=ExecuteWithResults("+@QueryText+")
EXEC@hr=sp_OAMethod@SQLServer,@result_str,@QueryResultsOUT
IF@hr0
BEGIN
PRINTerrorwithmethodExecuteWithResults
RETURN
END

--TheCurrentResultSetpropertycontrolsaccesstotheresultsetsofaQueryResultsobject
EXEC@hr=sp_OAMethod@QueryResults,CurrentResultSet,@CurrentResultSetOUT
IF@hr0
BEGIN
PRINTerrorgetCurrentResultSet
RETURN
END

--TheColumnspropertyexposesthenumberofcolumnscontained
--inthecurrentresultsetofaQueryResultsobject
EXEC@hr=sp_OAMethod@QueryResults,Columns,@ColumnsOUT
IF@hr0
BEGIN
PRINTerrorgetColumns
RETURN
END

--TheRowspropertyreturnsthenumberofrowsinareferenced
--queryresultsetorthenumberofrowsexistinginatable
EXEC@hr=sp_OAMethod@QueryResults,Rows,@RowsOUT
IF@hr0
BEGIN
PRINTerrorgetRows
RETURN
END

--创立Excel.Application工具
EXEC@hr=sp_OACreateExcel.Application,@objectOUT
IF@hr0
BEGIN
PRINTerrorcreateExcel.Application
RETURN
END

--取得Excel事情簿工具
EXEC@hr=sp_OAGetProperty@object,WorkBooks,@WorkBooksOUT
IF@hr0
BEGIN
PRINTerrorcreateWorkBooks
RETURN
END

--在事情簿工具中到场一事情表
EXEC@hr=sp_OAGetProperty@WorkBooks,Add,@WorkBookOUT
IF@hr0
BEGIN
PRINTerrorwithmethodAdd
RETURN
END

--Range工具(A1单位格)
EXEC@hr=sp_OAGetProperty@object,Range("A1"),@RangeOUT
IF@hr0
BEGIN
PRINTerrorcreateRange
RETURN
END

SELECT@indRow=1
SELECT@off_Row=0
SELECT@off_Column=1

WHILE(@indRow<=@Rows)
BEGIN
SELECT@indColumn=1
WHILE(@indColumn<=@Columns)
BEGIN
--TheGetColumnStringmethodreturnsaQueryResultsobjectresultsetmemberconvertedtoaStringvalue
EXEC@hr=sp_OAMethod@QueryResults,GetColumnString,@result_strOUT,@indRow,@indColumn
IF@hr0
BEGIN
PRINTerrorgetGetColumnString
RETURN
END

EXEC@hr=sp_OASetProperty@Range,value,@result_str
IF@hr0
BEGIN
PRINTerrorsetvalue
RETURN
END

EXEC@hr=sp_OAGetProperty@Range,Offset,@RangeOUT,@off_Row,@off_Column
IF@hr0
BEGIN
PRINTerrorgetOffset

RETURN
END

SELECT@indColumn=@indColumn+1

END

SELECT@indRow=@indRow+1
SELECT@code_str=Range("A+LTRIM(str(@indRow))+")
EXEC@hr=sp_OAGetProperty@object,@code_str,@RangeOUT
IF@hr0
BEGIN
PRINTerrorcreateRange
RETURN
END

END

SELECT@result_str=execmaster..xp_cmdshelldel+@filename+,no_output
EXEC(@result_str)--假如存在@filename文件,则先删除
SELECT@result_str=SaveAs("+@filename+")
EXEC@hr=sp_OAMethod@WorkBook,@result_str
IF@hr0
BEGIN
PRINTerrorwithmethodSaveAs
RETURN
END

EXEC@hr=sp_OAMethod@WorkBook,Close
IF@hr0
BEGIN
PRINTerrorwithmethodClose
RETURN
END

EXEC@hr=sp_OADestroy@object
IF@hr0
BEGIN
PRINTerrordestroyExcel.Application
RETURN
END

EXEC@hr=sp_OADestroy@SQLServer
IF@hr0
BEGIN
PRINTerrordestroySQLDMO.SQLServer
RETURN
END
GO


因此,我们的第一个“米”,就是二进制日志binlog必须是rowbased的。在rowbase下,二进制日志binlog同时记录了更新前后的整行记录。

深爱那片海 发表于 2015-1-19 21:06:51

在select语句中可以使用groupby子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。

灵魂腐蚀 发表于 2015-1-28 10:35:53

比如,MicrosoftSQLServer2008的某一个版本可以满足现在的这个业务的需要,而且价格还比Oracle11g要便宜,那么这一产品就是适合的。

若相依 发表于 2015-2-5 15:04:18

换言之,只有在不断的失败中尝试成功,而关于失败的总结却是很少的

谁可相欹 发表于 2015-2-12 10:06:36

如安全管理、备份恢复、性能监控和调优等,SQL只要熟悉基本操作就可以,只要程序设计部分只要稍加了解即可(如存储过程、触发器等)。

不帅 发表于 2015-3-3 02:26:27

是要和操作系统进行Socket通讯的场景。否则建议慎重!

变相怪杰 发表于 2015-3-11 08:53:58

一直以来个人感觉SQLServer的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。(有次作试验发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。)

第二个灵魂 发表于 2015-3-18 00:59:48

不好!如果出了错;不好调试;不好处理!其实web开发将代码分为3层:web层;业务逻辑层和数据访问层;一般对数据库的操作都在数据访问层来做;这样便于调试和维护!而且将来如果是换了数据库的话;你只需要改数据层的代码;其他层的基本可以不变!要是你在jsp中直接调用sql数据库;那么如果换了数据库呢?岂不都要改?如果报了异常呢?怎么做异常处理?

精灵巫婆 发表于 2015-3-25 09:22:21

需要注意的一点,也是我使用过程中发现的一个问题。在建立function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。
页: [1]
查看完整版本: MSSQL网页编程之SQL Server 与 Excel