Questions tagged «sql-server»

所有版本的Microsoft SQL Server(非MySQL)。还请添加特定于版本的标记,例如sql-server-2016,因为它通常与问题相关。

3
SQL Server插入到-如何识别导致截断错误的列
我有一个存储过程,将650个字段插入表中。插入失败,出现截断错误。 很简单 INSERT INTO SELECT (a bunch of fields) FROM (a bunch of tables) 下面是错误消息: 消息8152,级别16,状态14,过程DSP_Procedure,行1075字符串或二进制数据将被截断。 有没有一种快速的方法可以确定导致截断错误的字段? 要插入到表中的select语句具有650个字段的事实使得很难查明哪个字段导致截断错误。 我在想我可以一次注释掉字段块,以便一次仅将SP插入100个字段,然后在不同的时间运行SP 6或7次,直到我至少可以缩小到100个字段的组将包含导致截断错误的字段。 或者,我在想,也许我只能SELECT INTO新建一个表,然后将表中的数据长度与要插入到SP中的目标表的数据长度进行比较,以查看哪个字段包含的字段长度超出预期的字段长度。 .. 我正在使用SQL Server 2014。 还有更简单的选择吗?

4
如何使用存储过程为日期范围内的每一天创建一行?
我想创建一个存储过程,该过程将在给定日期范围内的每一天在表中创建一行。存储过程接受两个输入-用户所需日期范围的开始日期和结束日期。 因此,假设我有一个像这样的表: SELECT Day, Currency FROM ConversionTable Day是DateTime,而Currency只是一个整数。 为了简单起见,我们总是希望对于每个插入的行,“货币”列为1。因此,如果有人输入“ 2017年3月5日”作为开始日期,并输入“ 2017年4月11日”作为结束日期,我希望创建以下行: 2017-03-05 00:00:00, 1 2017-03-06 00:00:00, 1 ... 2017-04-11 00:00:00, 1 对存储过程进行编码的最佳方法是什么?我在测试环境中使用SQL Server 2008 R2,但实际环境中使用SQL Server 2012,因此,如果2012年引入了新功能,可以简化此任务,则可以升级测试计算机。

2
主数据库已损坏,实例无法启动-我有什么选择?
救命!我的主数据库已损坏,我什至无法使SQL实例联机!我有什么选择来备份服务器? 我确实有master的备份,但是MSDN页面“还原master数据库”要求我以单用户模式启动实例,而我做不到! (注意:我没有针对SQL版本指定这个问题,以便成为更广泛应用的参考。关于DBA.SE也有一些类似的问题,但是没有涉及服务器无法启动的问题。)

5
如何检查我可以在其上运行查询的数据库服务器上安装了什么数据库引擎?
我想检查可以访问的Datasase服务器上正在运行哪种类型的sql。我只能访问Web界面和表列表。 通过该接口,我可以对列表中存在的表运行查询。 我如何获得有关服务器和服务器运行版本的更多信息。我不知道服务器正在运行的IP或PORT。 我想知道服务器是MySQL,Mircosoft SQL Server,Oracle SQL,Postgre SQL还是其他sql服务器。 我正在谈论的网站就是这个网站: w3schools.com SQL编辑器。 编辑2:尽管某些命令选择sqlite_version()对我有用,但它不起作用。这是响应的屏幕截图。 编辑3:在Chromium浏览器上,命令运行正常。但是,在Firefox浏览器上,该命令无效。 我还提到我正在运行Linux。 您认为可能是在Firefox和Chrome上获得不同结果的原因是什么?

1
如何在统计中确定直方图的步数
如何在SQL Server的“统计信息”中确定直方图步数? 为什么即使我的键列有200多个不同的值,它也限制为200步?有决定因素吗? 演示版 模式定义 CREATE TABLE histogram_step ( id INT IDENTITY(1, 1), name VARCHAR(50), CONSTRAINT pk_histogram_step PRIMARY KEY (id) ) 在表中插入100条记录 INSERT INTO histogram_step (name) SELECT TOP 100 name FROM sys.syscolumns 更新和检查统计信息 UPDATE STATISTICS histogram_step WITH fullscan DBCC show_statistics('histogram_step', pk_histogram_step) 直方图步骤: +--------------+------------+---------+---------------------+----------------+ | RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | …

1
SQL Server中统计信息的默认样本大小是多少?
从MSDN: 如果(SAMPLE, FULLSCAN, RESAMPLE)未指定任何样本选项,则查询优化器默认对数据进行采样并计算样本大小。 如何确定统计数据的默认样本量? 我经历了MSDN,但没有找到任何公式或方法来标识默认样本大小。到处都只有公式可以触发自动统计信息更新。任何指针都会有所帮助。

1
UPDATE STATISTICS…WITH ROWCOUNT后如何重置统计信息
为了进行查询调整和测试,您可以通过运行手动将行计数和页计数分配给表的索引统计信息UPDATE STATISTICS。但是,如何将统计信息重新计算/重置为表的实际内容? --- Create a table.. CREATE TABLE dbo.StatTest ( i int NOT NULL, CONSTRAINT PK_StatTest PRIMARY KEY CLUSTERED (i) ); GO --- .. and give it a thousand-or-so rows: DECLARE @i int=1; INSERT INTO dbo.StatTest (i) VALUES (@i); WHILE (@i<1000) BEGIN; INSERT INTO dbo.StatTest (i) SELECT @i+i FROM dbo.StatTest; …

2
未使用的索引最佳做法
根据此查询,如果我发现总读取量很少(非常接近0或0,例如1或2),而用户更新量则较高或中等(我无法通过此查询找到插入或删除的内容),行数很大时,理论上我应该删除索引。 SELECT DISTINCT OBJECT_NAME(s.[object_id]) AS ObjectName , p.rows TableRows , i.name AS [INDEX NAME] , (user_seeks + user_scans + user_lookups) AS TotalReads , user_updates UserUpdates FROM sys.dm_db_index_usage_stats s INNER JOIN sys.indexes i ON i.[object_id] = s.[object_id] AND i.index_id = s.index_id INNER JOIN sys.partitions p ON p.object_id = i.object_id WHERE OBJECTPROPERTY(s.[object_id],'IsUserTable') …

6
将多个值存储在一行的一个字段中而不是单独存储的可能的好处
在我们上一次的每周会议上,一个没有数据库管理经验的人提出了以下问题: “是否有一种场景可以证明以行(字符串)而不是几行的形式存储数据?” 让我们假设有一个表countryStates,我们要在其中存储一个国家的州。在本示例中,我将使用USA,并且为了懒惰,不会列出所有州。 在那里,我们将有两列;一个被称为Country,另一个被称为States。作为讨论在这里,并通过@ srutzky提出的答案时,PK会通过定义的代码ISO 3166-1阿尔法-3。 我们的表如下所示: +---------+-----------------------+-------------------------------------------------------+ | Country | States | StateName | +---------+-----------------------+-------------------------------------------------------+ | USA | AL, CA, FL,OH, NY, WY | Alabama, California, Florida, Ohio, New York, Wyoming | +---------+-----------------------+-------------------------------------------------------+ 当向朋友开发人员询问相同的问题时,他说,从数据流量大小的角度来看,这可能很有用,但是如果我们需要操纵这些数据则没有用。在这种情况下,必须在应用程序代码上具有智能,该智能可以转换列表中的此字符串(假设可以访问此表的软件需要创建一个组合框)。 我们得出的结论是,该模型不是很有用,但是我怀疑可能有一种使之有用的方法。 我想问的是,你们中是否有人已经以一种切实有效的方式看到,听到或做过类似的事情。

3
可怜的基数估计使INSERT无法进行最少的记录?
为什么第二个INSERT语句比第一个语句慢5倍? 从生成的日志数据量来看,我认为第二个不符合最小日志记录的条件。但是,《数据加载性能指南》中的文档指出,两个插入都应该能够被最小限度地记录。因此,如果最小日志记录是关键性能差异,那么为什么第二个查询不符合最小日志记录的条件?可以采取什么措施来改善这种情况? 查询#1:使用INSERT ... WITH(TABLOCK)插入5MM行 考虑以下查询,该查询将5MM行插入堆中。该查询在中执行1 second并生成64MB事务日志数据,如所报告sys.dm_tran_database_transactions。 CREATE TABLE dbo.minimalLoggingTest (n INT NOT NULL) GO INSERT INTO dbo.minimalLoggingTest WITH (TABLOCK) (n) SELECT n -- Any table/view/sub-query that correctly estimates that it will generate 5MM rows FROM dbo.fiveMillionNumbers -- Provides greater consistency on my laptop, where other processes are running OPTION …

2
优化25+百万行的查询
我正在使用MS SQL,并且必须在同一表上以不同条件运行多个查询。最初,我在原始表上运行了每个查询,尽管它们都共享一些过滤条件(即日期,状态)。这花费了很多时间(大约2分钟)。 数据行中有重复项,并且所有索引都是非聚集的。我只对4列的标准感兴趣,并且结果应仅输出所有查询的计数。 列需要:TABLE,FIELD,AFTER,DATE,并且对每一个的索引DATE和TABLE。 在仅创建了我需要的字段的临时表之后,它降到了1:40分钟,这仍然非常糟糕。 CREATE TABLE #TEMP ( TABLE VARCHAR(30) NULL, FIELD VARCHAR(30) NULL, AFTER VARCHAR(1000) NULL, DATE DATETIME, SORT_ID INT IDENTITY(1,1) ) CREATE CLUSTERED INDEX IX_ADT ON #TEMP(SORT_ID) INSERT INTO #TEMP (TABLE, FIELD, AFTER, DATE) SELECT TABLE, FIELD, AFTER, DATE FROM mytbl WITH (NOLOCK) WHERE TABLE = 'OTB' …


4
NVARCHAR列作为PRIMARY KEY或UNIQUE列
我正在开发SQL Server 2012数据库,并且对nvarchar列作为主键有疑问。 我有这张桌子: CREATE TABLE [dbo].[CODES] ( [ID_CODE] [bigint] IDENTITY(1,1) NOT NULL, [CODE_LEVEL] [tinyint] NOT NULL, [CODE] [nvarchar](20) NOT NULL, [FLAG] [tinyint] NOT NULL, [IS_TRANSMITTED] [bit] NOT NULL DEFAULT 0, CONSTRAINT [PK_CODES] PRIMARY KEY CLUSTERED ( [CODE_LEVEL] ASC, [CODE] ASC ) ) 但是现在我想使用[CODE]列作为主键并删除[ID_CODE]列。 如果我的NVARCHAR专栏为,是否有任何问题或惩罚PRIMARY KEY? [CODE]列值必须是唯一的,因此我认为可以UNIQUE为该列设置约束。 我必须用[CODE]作主键还是UNIQUE对[CODE]列设置约束会更好?

1
如何允许执行存储过程但不能执行写操作?
我想在我的SQL Server 2012实例上设置一个“读取”用户。我想让他有权执行任何存储过程,函数或直接SQL语句,该语句从所有表和视图中检索数据,但不进行更新或插入(即,读取任何内容而不写入任何内容)。 我是否可以在不按名称专门授予每个函数或存储过程权限的情况下进行设置,而是授予他对任何函数或存储过程的执行权限,而只是取消修改表的权限? 如果我改为运行SQL Server 2008,会发生什么变化吗? 澄清和补充: 如果存储过程更改了数据,则用户应收到错误消息(拒绝修改或完全拒绝访问存储过程)。 如果潜在的解决方案涉及拒绝权限,我是否可以不授予某些权限而不是拒绝? 是否可以在一条语句中将拒绝应用于数据库中的所有表,视图等(现在和将来存在)?

5
有效传输大量(8400万行)数据
我大约有8400万行。所有这些都需要转移到同一服务器上的单独数据库中,然后我删除以从源数据库中删除大约6000万行。 8400万行都在同一表中。仅该表就占整个数据库的90%。 因此...来源:8400万行-> 2400万行目标:0行-> 8400万行 源运行完全恢复模式,目标将运行简单。 我想知道最有效的方法是什么? 计划A: 1)插入目标SELECT * FROM源 2)截断源 3)插入源SELECT * FROM目标WHERE keep_condition = 1 方案B: 1)将源数据库的备份还原为目标数据库 2)删除除目标数据库所需表之外的所有表 3)截断源 4)插入源SELECT * FROM目标WHERE keep_condition = 1 计划C: 1)插入目标SELECT * FROM源 2)删除源WHERE keep_condition = 0 或者是其他东西? 谢谢
11 sql-server 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.