我有一个场景,由于 8060 的最大行大小限制,某些插入/更新失败。对于具有大量 varchar 250 到 500、数字和日期时间列的表,会发生这种情况。我试图在我的测试环境中重现同样的场景,但无法这样做。
你们知道如何在测试环境中重现它吗?任何示例都非常适合解释。
我的环境是SQL server 2005 Ent。版。我的表有 ~470 列。我知道这是一个糟糕的设计,但它不在我的控制范围内。
我在下面尝试过,但它不起作用:
create table test (col1 varchar(5000), col2 varchar(5000))
insert into test values (replicate('A', 5000), replicate('B', 5000))
Run Code Online (Sandbox Code Playgroud)
即使记录长度大于 8060,它也能成功插入。
SQL Server 2005
我运行了“dbcc SQLPerf(logspace)”,然后进行了两次日志备份,然后再次运行“dbcc SQLPerf(logspace)”。尽管“dbcc opentran (foo)”表示没有活动的打开事务,但与使用的 48.55% 相比没有变化。
这是否意味着存在阻止日志可用空间在备份后更改的非活动打开事务?
谢谢。
长话短说,我们这里有一个数据库,用于管理一些员工数据,例如电子邮件、名字、姓氏等。我们公司购买了这个基于 SAP 的费用报告系统:| 这需要以非常奇怪的格式导出基于员工的数据。在不涉及太多细节的情况下,此数据的导出总共需要 137 列,其中许多列具有空值。
简单 我整理了一个查询,该查询基本上从我们的数据库中提取了这些信息,并设置了一些需要的常量。这个查询在这个问题中是什么并不相关,它只是一个SELECT提取一些数据的语句。
然后,我需要每天使用特定的文件名和管道分隔格式将其导出,效果如下:
--employee export
DECLARE @FileName varchar(500)
SET @FileName = (SELECT '\\someFileServer\Public\someFolder\employee_p06010603ace_305_202105_' + REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(19), CONVERT(DATETIME, getdate(), 112), 126), '-', ''), 'T', ''), ':', '') + '.txt')
DECLARE @sql varchar(8000)
DECLARE @header varchar(8000)
SET @sql= 'bcp "exec [MyDBServer].[MyDbName].dbo.ConcurEmployeeExport" queryout ' + @FileName + ' -c -T -t "|"'
Exec master..xp_cmdshell @sql
Run Code Online (Sandbox Code Playgroud)
完美,我得到这样的行:
305|Jon| |Doe|10217487|10217487@t|
305|Steve| |Smith|10217522|10217522@t|
Run Code Online (Sandbox Code Playgroud)
大约有 130 多列,不想显示所有这些,因为它无关紧要。我以为我已经完成了,直到实现协调员说 yes 看起来不错,但第一行需要从这个奇怪的行开始并带有一些值。
这意味着我拥有的结果查询应该有一个额外的行,其中包含一些值......简单我以为我会联合他们想要的......所以我做到了。
除了UNION ALL我必须输入一些额外的空值来匹配我的查询中的列数。问题是当我运行导出时,我最终得到了一堆用管道分隔的空列,我最终得到了这个:
100|0|SSO|UPDATE|EN|N|N| | | | | | …Run Code Online (Sandbox Code Playgroud) 由于 MSDN 没有说太多,如果我执行以下查询会发生什么?
update claims set status='Awaiting Auth.'
where status = 'Approved'
Run Code Online (Sandbox Code Playgroud)
我可以使用ClaimStatusName链接表的列dimClaimStatus来更新通过外键引用的主表吗?
视图本身查询多个表,主表是tabData,我也想用上面的查询更新。我想改变fiClaimStatus在tabData从FK该手段 Approved在引用表dimClaimStatus来Awaiting Auth.。它是这样工作的吗?
tabData 中的每一行只能有一个视图行。
这是视图:
CREATE VIEW [dbo].[Claims]
AS
SELECT mu.MarketUnitName AS MarketUnit,
c.CountryName AS Country,
gsp.GSPName AS GSP,
gsp.WCMSKeyNumber AS GspNumber,
sl.SLName AS SL,
sl.WCMSKeyNumber AS SlNumber,
m.ModelName AS Model,
m.SalesName AS [Model-Salesname],
s.ClaimStatusName AS [Status],
d.Work_Order AS [Work Order],
d.SSN_Number AS IMEI,
.... more columns ....
idData, -- …Run Code Online (Sandbox Code Playgroud) 我有一个特定的表,列数据类型为 float(53),非空。根据Microsoft 文档,可以存储在此数据类型中的 0 以上的最小值是 2.23E-308。但是,我能够存储一个小得多的值,小到 4.94065645841247E-324。请参阅下图,证明 SQL Server 可以存储和检索文档中指定范围之外的值:
当我运行如下查询时:
select 4.7E-309
Run Code Online (Sandbox Code Playgroud)
SQL Server 说: Warning: the floating point value '4.7E-309' is too small. It will be interpreted as 0.
截图中插入的值是通过 C++ ADO 接口使用记录绑定插入的。
我有几个问题:
为什么 SQL Server 处理文档中指定范围之外的值?同样,当查询中存在“超出范围”值时,为什么 SQL Server 会发出警告,而数据库显然可以存储超出该范围的值?
浮点数是如何存储在 SQL 数据库表上的,是否有任何 SQL 服务器设置会严格执行一个 SQL 服务器而不是另一个 SQL 服务器上的范围?
我正在尝试解决 ADO 记录绑定(可能)由于值超出范围而被拒绝的问题,但是我所有重现该问题的测试(在不同的 SQL 服务器实例上)表明 SQL 接受的值远远超出文档中指定的限制。任何有关如何在 SQL 中存储和处理浮点的信息(特别是与 .NET 或 C++ 之类的东西有关)将不胜感激。
我已经使用 SQL Server 2005 和 2008 对此进行了测试,结果相同。
我最近停止接收 sql 代理作业失败通知。经过调查,报告的错误是:
The mail could not be sent to the recipients because of the mail server failure. (Sending Mail using Account 1 (2017-08-16T02:40:14). Exception Message: Could not connect to mail server. (No such host is known).
邮件帐户设置没有改变,我确认它看起来是正确的。此外,我可以使用SSMS 中的“发送测试电子邮件...”功能成功发送和接收电子邮件。那么为什么工作不能发送电子邮件呢?
由于“发送测试电子邮件...”功能将电子邮件排队,因此以这种方式发送它与发送它的作业相比似乎没有权限问题。此外,这表明这不是防火墙问题。所以唯一的区别是一天中的时间......作业在半夜运行......但我想不出任何系统配置会在那时发生变化。
有什么其他想法要检查吗?
我试图更好地理解 SQL 中的数字类型,并且读到十进制类型总是需要 17 个字节。但是,MS Docs列出了一个表格,指示使用的空间量取决于小数的精度。所以我尝试使用该datalength功能对其进行测试。
create table tbl_TestDec(dec1 decimal(19,4), dec2 decimal(20,4), dec3 decimal(9,4))
insert into tbl_TestDec
select 1, 1, 1
select datalength(dec1), datalength(dec2), datalength(dec3) from tbl_TestDec
Run Code Online (Sandbox Code Playgroud)
这输出:
5 5 5
Run Code Online (Sandbox Code Playgroud)
我期待9 13 5或17 17 17。我正在使用 SQL Server 2005。所有小数都是 vardecimal 还是我误解了 datalength 函数?
请告诉我如何修改此 SQL 选择以使用数据透视而不是所有 case 语句。
SELECT t.ProjectId,
COALESCE(MAX(ExecutiveChampion), 'n/a'),
COALESCE(MAX(BusinessOwner), 'n/a'),
COALESCE(MAX(BusinessAnalyst), 'n/a'),
COALESCE(MAX(GeneralContractor), 'n/a'),
COALESCE(MAX(PrimaryPM), 'n/a'),
COALESCE(MAX(DevelopmentManager), 'n/a'),
COALESCE(MAX(DevelopmentLead), 'n/a'),
COALESCE(MAX(TDM), 'n/a'),
COALESCE(MAX(PTM), 'n/a')
FROM (
SELECT pl.ProjectId,
CASE WHEN StakeholderCID = 95 THEN FullName ELSE NULL END as 'ExecutiveChampion',
CASE WHEN StakeholderCID = 96 THEN FullName ELSE NULL END as 'BusinessOwner',
CASE WHEN StakeholderCID = 97 THEN FullName ELSE NULL END as 'BusinessAnalyst',
CASE WHEN StakeholderCID = 100 THEN FullName ELSE NULL END as 'GeneralContractor',
CASE WHEN StakeholderCID …Run Code Online (Sandbox Code Playgroud) 我最近发现 SQL Server 2005 不允许newid()在用户定义的函数中使用。为什么是这样?
我有一个适合我需求的替代解决方案,所以我不是在寻找解决这个问题的方法。我很好奇为什么设计师会做出这个决定。
我现在有点困惑。有人可以用一个简单的答案来回答我这个问题。
我有一个用户 [user_test],并为一个数据库 [database_test] 分配了 [db_owner] 角色。用户的默认架构是 [user_test] 并且几乎所有来自 [database_test] 的对象都是在架构 [user_test] 下创建的。在数据库中还存在 3 个具有架构 [dbo] 的对象
用户对两种模式都有权限:[dbo] 和 [user_test],无需在对象引用前面的 select 语句中明确指定它们。
当用户 [user_test] 调用对象时,SQL 检查的第一个模式是什么?
我的意思是,如果 [user_test] 从 dbo 模式中选择一个对象(前面没有模式),SQL 会先检查它指定的默认模式,然后再检查 dbo 吗?
谢谢,