SQL Seversqlserver还原数据库库难题

Sql Server数据库 group by 语句问题!_百度知道
Sql Server数据库 group by 语句问题!
&求正确Sql语句,leibie开始我用Mysqlselect * from chanpingroup by leibie显示所有类型并分类,状态 1,无错&zuixin_chanpin,name。&nbsp,级别 16,因为该列没有包含在聚合函数或 GROUP BY 子句中,不要光解释我的一张表 chanpinid,image.id'现在换用SqlServer却出现消息 8120; 无效,第 1 行选择列表中的列 &#39
提问者采纳
决办法,写全2:1、select后的星号用字段明代替
其他类似问题
您可能关注的推广
数据库的相关知识
其他2条回答
如果group by 后面不包含所有字段,如果使用了group by语句!举例:select a from t1 group by a 是可以的select a!当然星号(*)表示所有字段,举例,是这样的我晕,在SQL Server中!select a!还有一种意外情况就是使用聚合函数,必须在group by 子句后面的字段集合内! 这里count(b)是b字段用在聚合函数中了,b 是对的, count(b) from t1 group by a 是可以的,不会有语法错误,那么在select 后的字段:select a,那肯定就有语法错误,b from t1 group by a,b from t1 group by a 是错的,聚合函数中的字段不算在查询字段内
你需要加入count,avg,sum之类的运算,才能用group by你需要的最终结果不明确,所以没法写语句
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁酷勤网 C 程序员的那点事!
当前位置: >
浏览次数:次
数据库实例:
数据库名: MYDB
登录名: user
用户名: user
密码:  123456
数据库转移方式: 方法一:附加数据库
&&&&&&&&& 先决条件: MYDB_Data.MDF&& , MYDB_Data.LDF
步骤-:创建新登录。
企业管理器-> 安全性->登录->(右键点击)新建登录,出现下图所示对话框,创建登录用户
         
步骤二:附加数据库。
企业管理器->数据库-&(右键选择)所有任务-&(点击)附加数据库,并为默认用户dbo指定登录者。出现下图所示对话框
&& 注:上面的指定数据库所有者,是将用户dbo权限附值给你所指定的登录者。
步骤三:修改登录者默认数据库。
企业管理器->安全性->登录,双击&user&行出现下图所示对话框,修改数据库的默认数据库&MYDB&下图
步骤四:验证转移的数据库的用户权限是否分配正确。如下图:
&&由上图可看出,有些用户(如user),在数据库附加时其丢失了登录者。这样会造成user登录数据库时无权限操作user所有者的数据库对象。
解决办法:
1.打开查询分析器,输入&select sid ,name from master.dbo.syslogins where name="user"&,得到 登录名用&&&&& user&的SID。如下图:
2.打开SQL Server属性,选择服务器设置,勾选&允计系统目录直接进行修改&。只有进行此操作后,才可以进行3操作
&& 3.将MYDB数据库中用户为&user&的对应SID改为由1获得的SID。这样用户&user&的权限就附给了登录名&user&,实现的语句如下。
update MYDB.dbo.sysusers
SET sid=CONVERT(varbinary, 0x25BB5D48B4C82AF)
where name="user"
4.打开SQL Server属性,选择服务器设置,勾去&允计系统目录直接进行修改&。
5.重新连接SQL服务,你会发现。User用户的权限已经附给了登录&user&
方法二:还原数据库
&&&&&&&&& 先决条件: MYDB数据库的备份文件
步骤一: 根据以下信息创建一个空数据库
数据库名: MYDB
登录名: user
用户名: user
密码:  123456
步骤二: 利用SQL Server的还原功能,调用MYDB的备份文件,还原数据库。
步骤三: 验证转移的数据库的用户权限是否分配正确。(参考方法一步骤四)
本文来自:
& 相关主题:SQL Server内存会不断增加
当 SQL Server 数据库引擎在 Microsoft? Windows NT? 或 Windows? 2000 上运行时,其默认内存管理行为并不是获取特定的内存量,而是在不产生多余换页 I/O 的情况下获取尽可能多的内存。为此,数据库引擎获取尽可能多的可用内存,同时保留足够的可用内存以防操作系统交换内存。
SQL Server 实例在启动时通常获取 8 到 12 MB 的内存以完成初始化过程。当实例完成初始化后,就不会再获取更多的内存,直到用户连接到该实例并开始产生工作负荷。这时,该实例根据需要不停地获取内存以支持工作负荷。随着更多的用户连接并运行查询,SQL Server 将获取支持需求所需的额外内存。该实例将继续获取内存直到达到自身的内存分配目标,并且直到达到该目标的下限才会释放任何内存。
为了在不产生多余换页 I/O 的情况下获取尽可能多的内存,SQL Server 的每个实例都设置一个内存获取目标,直到计算机的可用物理内存在 4 MB 到 10 MB 的范围内。之所以选择该范围是因为测试表明 Windows NT 和 Windows 2000 都有最小内存交换,直到内存分配等于可用物理内存减去 4 MB。工作负荷处理任务重的 SQL Server 实例保留的可用物理内存为范围的较低端 (4 MB);工作负荷处理任务轻的实例保留的可用物理内存为范围的较高端 (10 MB)。
SQL Server 实例的目标随工作负荷的改变而变化。当更多的用户连接并产生更多的工作时,该实例倾向于获取更多的内存以使可用的内存保持在 4 MB 的限制以下。当工作负荷减轻时,该实例将其目标调整为 10 MB 的可用空间,并释放内存给操作系统。将可用空间量保持在 10 MB 与 4 MB 之间可防止 Windows NT 或 Windows 2000 过多执行换页操作,同时使 SQL Server 得以获得尽可能最大的高速缓冲存储器而不至引起额外的交换。
实例的目标内存设置与数据库缓冲池的页相对于可用池大小的需求有关。在任何即时点,缓冲区页的总需求取决于满足所有当前执行的查询所需的数据页数。如果相对于高速缓冲存储器内的页数,数据页的需求很大,则当前在缓冲区内的每一页很可能在相对较短的时间内由新页替换。这可由&缓冲区管理器&对象的&页生命期&性能计数器来度量。对于相对较小的缓冲区有较高需求的情况将生成短生命期,而纯粹的影响就是使 I/O 增加,因为在页可由多个逻辑读取引用之前往往要被重写。为减轻这个问题,数据库引擎可以获取更多的内存以增加高速缓冲存储器的大小。当页生命期长时,数据库引擎将可用内存定位于目标的高端 (10 MB);而当页生命期短时,数据库引擎定位于目标范围的低端 (4 MB)。
随着其它应用程序在运行 SQL Server 实例的计算机上启动,它们消耗内存致使可用物理内存量降到 SQL Server 的目标以下。SQL Server 实例于是从其地址空间释放足够内存,以使可用内存量回到 SQL Server 的目标。如果有其它应用程序停止运行而使可用内存增多,SQL Server 实例将增加其内存分配大小。SQL Server 可以每秒释放并获取几 MB 字节的内存,这使它得以根据内存分配变化作出快速调整。
你可以通过设置允许sql server可以使用的最大内存来做限制:最小和最大服务器内存的影响
min server memory 和 max server memory 配置选项建立由 SQL Server 数据库引擎使用的内存量的上限和下限。数据库引擎并不立即获取 min server memory 中指定的内存量。数据库引擎启动时只使用初始化所需的内存。随着数据库引擎工作负荷的增加,它将继续获取支持工作负荷所需的内存。数据库引擎直到到达 min server memory 中指定的内存量才会释放任何所需的内存。一旦到达 min server memory,数据库引擎将使用标准算法(使操作系统的可用内存保持在 4 MB 到 10 MB 之间)获取和释放所需内存。唯一的区别是数据库引擎从不将内存分配降到 min server memory 所指定的水平下,也从不获取超过max server memory 所指定水平的内存。
数据库引擎获取的内存量完全取决于放置在实例上的工作负荷。不处理很多请求的 SQL Server 实例可能永远达不到 min server memory。
如果为 min server memory 和 max server memory 指定相同的值,则一旦分配给数据库引擎的内存达到该值,数据库引擎将停止动态释放和获取内存。
如果在运行 SQL Server 实例的计算机上频繁启动或停止其它应用程序,启动这些应用程序所需的时间可能会因 SQL Server 实例分配和释放内存而延长。另外,如果 SQL Server 是几个在一台计算机上运行的服务器应用程序中的一个,系统管理员可能需要控制分配给 SQL Server 的内存量。在这些情况下,可以使用 min server memory 和 max server memory 选项控制 SQL Server 可以使用的内存量。
何设置固定的内存量(企业管理器)
设置固定的内存量
展开一个服务器组。
右击一个服务器,再单击&属性&。
单击&内存&选项卡。
单击&使用固定的内存大小 (MB)&,然后将固定内存滑块放在适当的位置。
如果使用默认设置,则 Microsoft? SQL Server? 将动态配置内存。这是由sql server的内存管理机制决定的。
作者:Frank
编辑:Googler
猜你喜欢:
最新图文资讯
站长之家专栏推荐
增值电信业务经营许可证: 闽B2-号 - 北京公安局网监中心备案号: 95号 -
(C)CopyRight 2002- Inc All Rights Reserved. 站长之家 版权所有题目:
&&&& 表A&& 字段 A1(主键,自增长) A2& A3&&&& -- 2000万行数据
&&&& 表B&& 字段 B1(主键,自增长) B2 B3&&&& --& 100万行数据
要求:
&&&& 将表A的数据复制到表C中,并且表C中多两个字段& isB1& isB2,即&&&& A1& A2& A3& isB1&& isB2字段
简单概述我的做法:
& while循环(2000万次)
&&&&& 添加表C数据,执行修改新字段值(isB1,isB2[若A1=B1,则 isB1=1,否则isB1=0]).
问题:
&&& 当执行到第10万条左右时,效率非常低,加一条至少需要10秒的时间,并且有时候会出现断开连接的问题。
目的:
&&& 实现表C的数据,并要求高效率。
&&&&& 急求解!!!!
alter table c add isB1 char default '0';
alter table c add isB2
update c set isB1='1' where A1 in (select B1 from b);
这是一个子类的实现:
package com.autonavi.
import com.autonavi.batch.LayerBatchS
import com.autonavi.template.MoveT
* xx功能Action类
* @author shuo.cao
* @Company: Autonavi
上午11:02:06
public class Layer extends MoveTemplate&LayerBatchSetter& {
public void setCountSql() {
this.countSql = "select count(0) from EP_POILAYERS" ;
public void setInsertSql() {
this.insertSql = "insert into T_LAYERS (" +
"ID,LAYER_NAME,LAYER_DESC,USE_STATUS,CTDATE,PROPERTY,IS_OPEN_FOR_UP,IS_OPEN_FOR_DOWN," +
"IS_SHARED,USAGE_FLAG,IS_SHOW,IS_LOAD,LAYER_LEVEL" +
") values(?,?,?,?,to_date(?,'yyyy-MM-dd HH24:mi:ss'),?,?,?,?,?,?,?,?)" ;
protected void setSelectSql() {
//构造查询语句
StringBuilder sql = new StringBuilder() ;
sql.append("select * from (") ;
sql.append("select rownum r, p.* from EP_POILAYERS p where rownum &= ") ;
sql.append(MoveTemplate.END_ROW_NUM + " ") ;
sql.append("order by EPLYRID asc) ") ;
sql.append("where r & ") ;
sql.append(MoveTemplate.START_ROW_NUM) ;
this.selectSql = sql.toString() ;
还有另外的那个setter类:
package com.autonavi.
import java.sql.PreparedS
import java.sql.SQLE
import java.util.L
import java.util.M
import org.springframework.jdbc.core.BatchPreparedStatementS
import com.autonavi.util.StringU
* xx功能Action类
* @author shuo.cao
* @Company: Autonavi
上午11:05:01
public class LayerBatchSetter implements BatchPreparedStatementSetter {
private List&Map&String, Object&& list =
public LayerBatchSetter(List&Map&String, Object&& list){
this.list =
public int getBatchSize() {
return list.size();
public void setValues(PreparedStatement pstmt, int i) throws SQLException {
Map&String, Object& obj = list.get(i) ;
pstmt.setString(1, obj.get("EPLYRID")+"");
pstmt.setString(2, obj.get("LAYERNAME")+"");
pstmt.setString(3, obj.get("LAYERNAME")+"");
pstmt.setInt(4, 0);//用户状态
pstmt.setString(5, StringUtil.ObjSubString(obj.get("CTDATE"),0,19));
pstmt.setString(6, "");//图层属性
pstmt.setInt(7, 1);//向上开放
pstmt.setInt(8, 1);//IS_OPEN_FOR_DOWN
pstmt.setInt(9, 1);//IS_SHARED
pstmt.setInt(10, 1);//USAGE_FLAG
pstmt.setInt(11, 1);//IS_SHOW
pstmt.setInt(12, 1);//IS_LOAD
pstmt.setInt(13, 1);//LAYER_LEVEL
介绍下我的解决办法:
package com.autonavi.
import java.lang.reflect.C
import java.lang.reflect.InvocationTargetE
import java.lang.reflect.ParameterizedT
import java.lang.reflect.T
import java.sql.C
import java.sql.SQLE
import java.util.L
import java.util.M
import mons.logging.L
import mons.logging.LogF
import org.springframework.jdbc.core.BatchPreparedStatementS
import org.springframework.jdbc.core.JdbcT
* 数据迁移功能抽象类
* @author shuo.cao
* @Company: Autonavi
下午05:49:43
public abstract class MoveTemplate &T extends BatchPreparedStatementSetter&{
protected static Log log = LogFactory.getLog(MoveTemplate.class) ;
public static final String START_ROW_NUM = ":startRowNum" ;
public static final String END_ROW_NUM = ":endRowNum" ;
protected int batchSize = 30000 ;
protected String countS
protected String insertS
protected String selectS
private void init(){
this.setCountSql() ;
this.setSelectSql() ;
this.setInsertSql() ;
@SuppressWarnings("unchecked")
public void move(JdbcTemplate from, JdbcTemplate to){
Connection toc =
//初始化各参数
this.init() ;
toc = to.getDataSource().getConnection() ;
//1、统计一共多少数据
int countNum = from.queryForInt(this.getCountSql()) ;
("操作语句:"+this.getCountSql()) ;
("结果集总数为:"+countNum + " 条") ;
int l = (countNum + this.getBatchSize() - 1) / this.getBatchSize() ;
toc.setAutoCommit(false) ;
for(int i=0; i&l; i++){
int startRowNum = i * this.getBatchSize() ;
int endRowNum = (i+1) * this.getBatchSize() ;
if(i == l-1){
endRowNum = countN
//将变量转换为常量
this.replaceVariable(startRowNum, endRowNum) ;
List&Map&String, Object&& list = from.queryForList(this.getSelectSql()) ;
("第["+(i+1)+"]次获得结果集记录数:"+list.size() + " 条");
int[] ns = to.batchUpdate(this.getInsertSql(), this.newBatchPreparedStatementSetter(list)) ;
("第["+(i+1)+"]次batch记录数:"+ns.length + " 条");
("第["+(i+1)+"]次插入数据为:" + (startRowNum+1) + "--"+endRowNum);
//将常量换回变量,以便下一次循环使用
this.replaceConstant(startRowNum, endRowNum) ;
if(list.size() & 10000){
Thread.sleep(5000) ;
("第["+(i+1)+"]次循环结束!\n");
toc.setAutoCommit(true) ;
}catch (Exception e) {
//e.printStackTrace();
("【ERROR】数据迁移失败!原因如下:\n"+e.getMessage()) ;
if(toc != null){
toc.rollback() ;
} catch (SQLException e1) {
("【ERROR】connection.rollback()失败!");
e1.printStackTrace();
} finally{
if(toc != null){
toc.close() ;
} catch (SQLException e) {
("【ERROR】connection.close()失败!\n"+e.getMessage());
e.printStackTrace();
* 生成batchSetter对象
* @param list
* @throws SecurityException
* @throws NoSuchMethodException
* @throws IllegalArgumentException
* @throws InstantiationException
* @throws IllegalAccessException
* @throws InvocationTargetException
@SuppressWarnings("unchecked")
private final BatchPreparedStatementSetter newBatchPreparedStatementSetter(List&Map&String, Object&& list) throws SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException{
BatchPreparedStatementSetter setter =
Type t = this.getClass().getGenericSuperclass() ;
if(t instanceof ParameterizedType){
Type[] types = ((ParameterizedType)t).getActualTypeArguments() ;
Constructor&T& constructor = ((Class&T&) types[0]).getConstructor(List.class) ;
setter = constructor.newInstance(list) ;
* 将变量替换为常量(即startRowNum和endRowNum的值)
* @param startRowNum
* @param endRowNum
* @return 替换后的查询语句
private void replaceVariable(int startRowNum, int endRowNum){
this.selectSql = this.getSelectSql().replace(MoveTemplate.START_ROW_NUM, startRowNum+"").replace(MoveTemplate.END_ROW_NUM, endRowNum+"");
private void replaceConstant(int startRowNum, int endRowNum){
this.selectSql = this.getSelectSql().replace(endRowNum+"", MoveTemplate.END_ROW_NUM).replace(startRowNum+"", MoveTemplate.START_ROW_NUM) ;
* scope is 1-30000
* @param batchSize
protected final void setBatchSize(int batchSize) {
if(batchSize & 0 && batchSize & 30001){
this.batchSize = batchS
public abstract void setCountSql() ;
* 查询语句(下面是例子)
* StringBuilder sql = new StringBuilder() ;
* sql.append("select ID, X, Y, SPEED, HEIGHT, INPUTDATE, STATE from (") ;
* sql.append("select rownum r, ID, X, Y, SPEED, HEIGHT, INPUTDATE, STATE from EP_LOCRECORD where rownum &= ") ;
sql.append(MoveData.END_ROW_NUM + " ") ;
* sql.append("order by ID asc) ") ;
* sql.append("where r & ") ;
* sql.append(MoveData.START_ROW_NUM) ;
* @param selectSql
protected abstract void setSelectSql() ;
* insert语句要和select语句对应
* @param insertSql
public abstract void setInsertSql() ;
protected int getBatchSize() {
return batchS
private String getCountSql() {
return countS
private String getInsertSql() {
return insertS
private String getSelectSql() {
return selectS
楼主,如果2000万数据insert到另一个表里面,日志空间的管理十分重要,你所说的“ 当执行到第10万条左右时,效率非常低... ”很有可能是因为日志空间不足或是表的锁机制不合理造成的。
有两个办法解决这个效率问题:
1:将C表上的index全部drop掉再做insert,完成insert后重建index.
2:使用sql server的bcp工具.
我个人推荐使用bcp工具,速度快,且不写日志空间.
引用insert into c select * from a SQL语句可以这样写吗?
可以,但是列名必须得匹配。
insert into c select * from a SQL语句可以这样写吗?
isB2是什么意思,是说在a1=B1同时a2=b2吗?还是说B表存在一行b2的值等于a2?
如果只是判断a1在B表中的存在性还好说,同时加上a2的存在性,那效率确实很难提高。
先说说只判断a1的存在性的解决:
事先建好c表, 不带索引和主键
insert into c select a.a1,a.a2,a.a3, 1, 0 from A a where a.a1 in (select b1 from B)
insert into c select a.a1,a.a2,a.a3, 0, 0 from A a where a.a1 not in (select b1 from B)
至于isB2字段的值, 你得通过程序来更新了。
insert into c select *--先复制A表.
alter table c add isb1 smallint,isb2---添加两个新加的字段.
create index on c(a1)--a1创建索引...a1=B的主键,选择性是否好?(重复的数据是否多).
循环b表数据,根据相应的条件更新isb1,isb2列.(cursor循环).
cursor is select b1,b2 from b
--loop
1.分批添加,每批差不多10万条
2.把索引,约束都先停用,等都复制完了再添加上去
已解决问题
未解决问题当前位置:
VC中使用ADO链接SQLSERVER数据库问题(1)
来源: 联系QQ: 作者: <
发布时间: 12/09/28
VC中使用ADO链接SQLSERVER数据库问题&&&&调的时候遇到个莫名的错误,当我把server=127.0.0.1时,必须联网才能够打开数据库,而把server=local时,便会报错“未与信任的SQLServer连接相关联”,通过所得,解决方案如下:&&&&症状&&&&当您尝试连接到MicrosoftSQLServer2000时,可能收到以下错误信息:&&&&Loginfailedforuser''.Reason:NotassociatedwithatrustedSQLServerconnection.&&&&&&&&原因&&&&当SQLServer2000安全身份验证设置为“仅Windows”,并且存在下列情况之一时,就会发生此问题:?您正在尝试使用SQLServer登录连接到SQLServer2000数据库。&&&&?您正在尝试使用信任的SQLServer连接来连接到安装在基于MicrosoftWindows98的上的SQLServer2000桌面引擎(也称为MSDE2000)数据库。&&&&?您正在尝试从某Windows帐户连接到SQLServer2000数据库,而该帐户没有足够的权限连接到服务器。&&&&&&&&替代方法&&&&要解决此问题,请根据您遇到的症状使用下列方法之一:?SQLServer登录&&&&使用有效的Windows登录连接到SQLServer。如果必须继续使用SQLServer登录,您可以将在SQLServer2000中的安全身份验证模式更改为“SQLServer和Windows”。为此,请按照下列步骤操作:1.启动企业管理器。&&&&2.展开“MicrosoftSQLServers”,然后展开“SQLServer组”。&&&&3.右键单击要更改为“SQLServer和Windows”身份验证的服务器,然后单击“属性”。&&&&4.在“SQLServer属性”对话框中,单击“安全”选项卡,单击“SQLServer和Windows”,然后单击“确定”。&&&&5.当提示您重新启动SQLServer服务时,单击“是”。&&&&&&&&?SQLServer2000桌面引擎(MSDE2000)安装在基于MicrosoftWindows98的上&&&&当SQLServer2000桌面引擎安装在基于Windows98的计算机上时,必须使用标准的SQLServer登录连接到数据库。当您在基于Windows98的上安装SQLServer2000桌面引擎时,不支持“仅Windows”身份验证模式。&&&&?Windows帐户权限不足&&&&要解决此问题,必须将Windows帐户添加到SQLServer,然后为用户需要访问的每个数据库授予适当的权限。为此,请按照下列步骤操作:1.启动企业管理器。&&&&2.展开“MicrosoftSQLServer”,然后展开“SQLServer组”。&&&&3.展开您的服务器,然后展开“安全”。&&&&4.右键单击“登录”,然后单击“新建登录”。&&&&5.在“SQLServer登录属性”对话框中,在“名称”框中输入Windows帐户名。在“域”列表中,选择该Windows帐户所属的域。&&&&6.单击“数据库访问”选项卡,为客户端设置适当的权限,然后单击“确定”。&&&&注意:在添加帐户后,您仍然必须为用户需要访问的各个数据库对象授予访问权限。&&&&注意:我们建议您尽可能将SQLServer2000身份验证设置为“仅Windows”。&&&&
上一篇资讯:
下一篇资讯:
文章排行榜

我要回帖

更多关于 sqlserver导入数据库 的文章

 

随机推荐