我正在使用 Sql Server 2005 Express 版本在 xml 输出中显式地生成用户定义的节点。下面的代码工作正常,只是当用户表中不存在记录集时,我无法生成一个空节点。
代码:
select 1 as tag, null as parent,
FirstName as [User!1!FirstName!Element],
LastName as [User!1!LastName!Element]
FROM Users
FOR XML EXPLICIT
Run Code Online (Sandbox Code Playgroud)
输出:
<Users>
<FirstName>Ammy</FirstName>
<LastName>Dammy</LastName>
</Users>
<Users>
<FirstName>Lammy</FirstName>
<LastName>Lolly</LastName>
</Users>
Run Code Online (Sandbox Code Playgroud)
空表的预期输出:
<Users></Users>
Run Code Online (Sandbox Code Playgroud)
注意:我不喜欢这种xsnil方法,欢迎所有其他解决问题的方法
我在下面写了一个查询,它给我一个语法错误,为什么会这样做,
SELECT MAX('Row') FROM
(SELECT ROW_NUMBER() OVER(ORDER BY ID DESC) 'Row' FROM USERS)
Run Code Online (Sandbox Code Playgroud)
错误描述:
Incorrect syntax near ')'.
Run Code Online (Sandbox Code Playgroud)
我不明白:(
我遇到了一个选择语句运行时间太长的问题。我想知道我是否做错了什么,或者花这么长时间是否有意义。我使用的是 Microsoft SQL 2005 标准。我正在运行的选择需要大约 30 秒才能运行并返回大约 60000 条记录。这是sql:
SELECT l.ID, l.Number, l.Date, l.FirstName + ' ' + l.LastName Name,
isnull(l.Amount,0) Amount1, isnull(l.Interest,0) Interest1,
isnull(l.Interest2,0) Interest2, l.LastPayment,
l.NextDueDate, isnull(l.Aging,0) Aging, isnull(l.InterestRate,0) InterestRate,
ls.DisplayValue Status, lt.DisplayValue Type, l.LocationID
FROM Table1 l
JOIN Table2 ls ON (l.Table2ID=ls.ID)
JOIN Table3 lt ON (l.Table3ID=lt.ID)
WHERE
l.Table3ID IN (SELECT Value FROM fn_Split('5,4,3', ','))
AND l.Table2ID IN (SELECT Value FROM fn_Split('8,20,9,14,18,21,22,26,13,10,27,25,23,24,16,3,11,6,4,12,19,17,5,28,7,15', ','))
AND l.LocationID IN (SELECT Value FROM fn_Split('4,6,8,9,10,14,11,12,13', ','))
Run Code Online (Sandbox Code Playgroud)
我添加了索引,但似乎没有什么可以加快速度。如果我删除选择中除 l.ID 和 l.Number 之外的所有内容,我可以在大约 8 …
我们在 3 个不同的出版物中有一个现有表(发给 3 个不同的订阅者),其中 1 个出版物没有发布所有列。
所有这些都是事务性请求订阅。
我现在需要在此表中添加更多列,我们只想将它们添加到前两个出版物中。然而来自MSDN:
[ @publication_to_add =] 'publication_to_add' 是添加新列的发布的名称。Publication_to_add 是 nvarchar(4000),默认值为 ALL。如果为 ALL,则所有包含此表的发布都会受到影响。如果指定了publication_to_add,则只有该发布添加了新列。
这意味着您希望它指定1 个出版物或所有出版物。
帮助演示问题的示例表/出版物详细信息:
表样
[MyTable] (
ID int IDENTITY(1,1) NOT NULL,
myName varchar(50) NULL,
myDOB datetime,
myJob varchar(100),
mySpouseID int )
Run Code Online (Sandbox Code Playgroud)
发布/订阅者示例
[InternalPublication] All fields, sent to InternalAdmin system
[Reporting] All fields, sent to Reporting/Datawarehouse system
[External] sent to External accessable system, fields sent:
(ID, myName, myDOB)
Run Code Online (Sandbox Code Playgroud)
我如何添加:
[myMarriageDate] datetime NULL,
[myDivorceDate] datetime NULL …Run Code Online (Sandbox Code Playgroud) 客户希望我们的应用程序更快地处理更多数据,因此安排与他们的 dba 会面以讨论选项。
此应用程序会生成大量用于报告的数据。在每次运行之前,删除该项目的旧数据,执行计算,然后插入新数据。在繁忙时期,用户会排队数百个这样的生成任务,我们同时运行多达 30 个。每次运行可能会创建 60K 行。
dba 建议我们可以将应用程序更改为使用 30 个分区(例如,每个线程一个)以减少插入和删除期间线程之间的锁定。他们建议在标准 sql 中我们可以做类似的事情
INSERT INTO schema.table.partition (...) VALUES (...)
Run Code Online (Sandbox Code Playgroud)
我在msdn 文档中没有看到这种语法,这意味着更改这个应用程序很痛苦,但是否有可能做到这一点?据我了解,我们会改为使用分区函数基于表的列进行分区?
我已经阅读了创建分区函数文档,但我不完全确定如何创建一个函数来满足我们的需求。更糟糕的是,我还没有企业版来尝试这个,所以我为不正确的语法道歉。
我在想,例如,如果我们有一个 items 表和一个包含该项目数据的 itemdata 表,我们可能会通过基于类似的函数拆分数据来对 itemdata 表进行分区itemid mod 30。这会将项目 1 放在分区 1 中,将项目 2 放在分区 2 中,等等。我不确定我们是否可以在分区函数、方案、表声明中执行此操作,或者我们是否需要创建一个计算列并使用价值观条款?也不确定我们是否会看到任何性能改进?
这就是我认为我们可以实现的方式:
CREATE PARTITION FUNCTION SplittingItemIds_PFunc(decimal(18,0)) AS
RANGE LEFT FOR VALUES
(0,1,2,3, ... ,29)
CREATE PARTITION SCHEME SplittingItemIds_Scheme
AS PARTITION SplittingItemIds_PFunc
ALL TO ([PRIMARY]);
CREATE TABLE ItemData
(
Id decimal(18,0),
ItemId decimal(18,0),
...
)
ON …Run Code Online (Sandbox Code Playgroud) 我使用的是 SQL Server 2005 速成版。我注意到默认情况下Recovery Model设置为Simple。我将此选项更改为Full但想知道启用哪些其他选项以保证在没有备份的情况下完全恢复。
有没有办法对 SQL Server 2005 Express 数据库进行计划备份?
我有一个名为的表Cell,其中包含诸如Cell_ID,CellValue和 之类的列CellRow。
Cellrow最多可以有 1 到 5 的值。Cell_ID 字段上有一个聚集索引。该表包含 100000 行。
在我的查询中,我必须使用CellRowWHERE 子句中的列CellRow > 3来获取CellValue字段中的数据。问题是当我这样做时,总是表扫描使我的查询非常慢。
我还通过在CellRow字段上放置非聚集索引来检查它,但仍然进行索引扫描,因为该CellRow字段没有太多值,每次只有 1 到 5 个值。我不能CellID在 where 子句中使用。
我在查询中使用了许多表,例如
Table_1与接合table_2通过使用聚簇索引列和table 2与接合table_3通过使用非聚集的索引列,并table_3与被接合Cell通过使用非聚集的索引表。
最后的故事是,我从包括单元格表在内的所有表中得到不同的值,但是当我CellRow在 WHERE 子句中使用字段时,我得到了索引扫描。
任何解决方案:)
非常感谢!
对于一份报告,我正在查询用户假设必须根据百分比选择 TOP 值或固定行数。
我有两个想法
根据传递的参数调用两个不同的子存储过程。
if @param ='percent'
begin
exec sp_data_TOP_by_Percent
end
if @param ='perRow'
begin
exec sp_data_TOP_by_PerRow
end
Run Code Online (Sandbox Code Playgroud)
另一个想法是使动态 TSQL 查询像这样
declare @command nchar(max)
select @command = 'select top(10) '
+ case @param
when 'percent' then percent
else ' '
end
+ ' * '
+ 'from table
order by 1';
exec sp_executesql @command
Run Code Online (Sandbox Code Playgroud)
像这样的事情有第三种解决方案吗?
什么是更好的方法?第一个避免动态 TSQL,但在两个地方更难维护代码。我使用 MSSQL2005 作为数据库。
假设 SQL Server 表有两MailID列,最大值 = 5。
如果两个不同的用户在同一时间执行INSERT,尝试插入查询Max(MailId)+1到MailID列,是有可能,这两个新行可能获得的价值6?
我想了解 SQL Server 如何在内部同时处理多个请求。
我为我的性能基准测试练习设置了 sql server 2005,并且我将相同的数据库放在另一台服务器上,该服务器具有 sql server 2008 和硬件配置方面的精确副本。两台服务器的 Sql 服务器内存分配也相同。但是我的基准测试结果在 2008 年比 2005 年差。有人能帮我找到 sql server 2008 性能下降的原因吗?我需要注意什么,或者设置参数以获得更好或相同的结果集。
sql-server-2005 ×10
sql-server ×6
performance ×3
select ×2
count ×1
dynamic-sql ×1
locking ×1
parameter ×1
partitioning ×1
replication ×1
schema ×1
t-sql ×1
xml ×1