在SQL Server 2008中更改表(删除列)时,我单击了Generate Change Script按钮,我发现它生成的更改脚本会删除列,说"go",然后运行另一个看似要设置的ALTER TABLE语句表的锁升级为"TABLE".例:
ALTER TABLE dbo.Contract SET (LOCK_ESCALATION = TABLE)
Run Code Online (Sandbox Code Playgroud)
我还应该注意,这是更改脚本正在做的最后一件事.它在这做什么,为什么将LOCK_ESCALATION设置为TABLE?
我有一个T-SQL
脚本,使用s和s中的OUTPUT
子句实现一些同步逻辑.MERGE
INSERT
现在我在它上面添加一个日志层,我想添加第二个OUTPUT
子句将值写入报表.
我可以OUTPUT
在我的MERGE
陈述中添加第二个条款:
MERGE TABLE_TARGET AS T
USING TABLE_SOURCE AS S
ON (T.Code = S.Code)
WHEN MATCHED AND T.IsDeleted = 0x0
THEN UPDATE SET ....
WHEN NOT MATCHED BY TARGET
THEN INSERT ....
OUTPUT inserted.SqlId, inserted.IncId
INTO @sync_table
OUTPUT $action, inserted.Name, inserted.Code;
Run Code Online (Sandbox Code Playgroud)
这是有效的,但只要我尝试添加目标
INTO @report_table;
Run Code Online (Sandbox Code Playgroud)
我之前收到以下错误消息INTO
:
A MERGE statement must be terminated by a semicolon (;)
Run Code Online (Sandbox Code Playgroud)
我在这里找到了一个类似的问题,但它对我没有帮助,因为我要插入的字段在两个表之间不重叠,我不想修改工作同步逻辑(如果可能的话).
更新:
在马丁史密斯的回答后,我有了另一个想法并重新编写了我的查询如下:
INSERT …
Run Code Online (Sandbox Code Playgroud) 我正在使用SQL Server 2008 R2.我有一个名为EmployeeHistory的表,其中包含以下结构和示例数据:
EmployeeID Date DepartmentID SupervisorID
10001 20130101 001 10009
10001 20130909 001 10019
10001 20131201 002 10018
10001 20140501 002 10017
10001 20141001 001 10015
10001 20141201 001 10014
Run Code Online (Sandbox Code Playgroud)
请注意,随着时间的推移,Employee 10001已经更改了2个部门和多个主管.我想要做的是列出按日期字段排序的每个部门中该员工的工作的开始和结束日期.所以,输出看起来像这样:
EmployeeID DateStart DateEnd DepartmentID
10001 20130101 20131201 001
10001 20131201 20141001 002
10001 20141001 NULL 001
Run Code Online (Sandbox Code Playgroud)
我打算使用以下查询对数据进行分区,但失败了.部门从001变为002然后又变回001.显然我不能通过DepartmentID进行分区......我确信我忽略了显而易见的事情.有帮助吗?先感谢您.
SELECT * ,ROW_NUMBER() OVER (PARTITION BY EmployeeID, DepartmentID
ORDER BY [Date]) RN FROM EmployeeHistory
Run Code Online (Sandbox Code Playgroud) 我有一个学生表,其中包含以下字段:
student(student_id, student_name, student_avg)
Run Code Online (Sandbox Code Playgroud)
我需要在MySQL中编写一个查询,将结果显示为:
序列号.=>结果还应该有一个带有序列号的新列,1,2,3,...,n
就像结果中每行的自动增量一样.
student_id
student_name
student_avg > 4
Run Code Online (Sandbox Code Playgroud)
我不想以任何方式改变我的桌子.我所要做的就是写一个查询,它会给我上面的结果.我希望我很清楚.
示例数据:
student_id student_name student_avg
1 abc 2.5
2 xyz 4.1
3 def 4.2
Run Code Online (Sandbox Code Playgroud)
查询后的示例输出:
serial_no student_id student_name student_avg
1 2 xyz 4.1
2 3 def 4.2
Run Code Online (Sandbox Code Playgroud) 摘要:由于性能和可维护性问题,我已经看到很多反对在MS SQL 中使用SELECT*的建议.然而,这些帖子很多都很老 - 5到10年!它似乎是,许多这些职位的,其性能的担忧可能实际上已经相当小,甚至在自己的时间,并作为可维护性关注("哦,不,如果有人改变了列,并且被索引获取数据一个数组!你的SELECT*会让你遇到麻烦!"),现代编码实践和ORM(如Dapper)似乎 - 至少在我的经验中 - 消除了这些问题.
所以:SELECT*是否存在今天仍然存在的问题?
更大的背景:我已经开始在一个有很多旧MS代码(ASP脚本等)的地方工作,但我一直在帮助实现大量现代化,但是:我的大部分SQL经验实际上来自于MySQL和PHP框架和ORM - 这是我第一次使用MS SQL - 我知道两者之间存在细微差别.另外:我的同事比我年长一点,并且有一些担忧 - 对我来说 - 似乎"老了".("可空的字段很慢!避免它们!")但是又一次:在这个特定的领域,他们肯定比我有更多的经验.
出于这个原因,我还想问一下:现代ORM中的SELECT*是否安全无瑕,是否有安全和明智的做法,是否有最新的在线资源表明这样?
谢谢!:)
我的SQL查询生成XML输出:
select 'TEST.kml' as name,
(select 'TEST' as name, (
select (
select top 10 issue as name,
null as description,
null as 'Point/coordinates',
(
select
null as altitudeMode,
Coordinates as 'coordinates'
for xml path('Polygon'), type)
from Mapping for xml path('Placemark'), type))
for xml path ('Line') , type)
for xml path ('Doc'), root('kml'))
Run Code Online (Sandbox Code Playgroud)
我想将查询的输出保存为.XML文件到本地驱动器.请指教.
我们有一个使用LINQ to SQL(ORM)的.NET应用程序来调用一个视图,该视图包含来自不同数据库中多个对象的连接..NET应用程序超时调用此视图,但是我们的DBA运行以下语句:
sp_refreshview on the view and the subsequennt sql views
Run Code Online (Sandbox Code Playgroud)
应用程序再次开始运行.
该应用程序在接近20分钟后再次在同一视图上开始超时.因此,我们的DBA安排了一项工作,每30分钟运行一次上述声明.该视图没有结构上的变化,我们正试图弄清楚为什么要sp_refreshview
修复这个问题以及我们可以解决的潜在问题是什么?
我找不到任何提及Partition By
SQL 中窗口函数执行顺序的来源。
和 的顺序一样Group By
吗?
Select *, row_number() over (Partition by Name)
from NPtable
Where Name = 'Peter'
Run Code Online (Sandbox Code Playgroud)
我知道如果Where
先执行,它只会查看Name = 'Peter'
,然后执行仅聚合此特定人员而不是整个表聚合的窗口函数,这样效率更高。
但是当查询是:
Select top 1 *, row_number() over (Partition by Name order by Date)
from NPtable
Where Date > '2018-01-02 00:00:00'
Run Code Online (Sandbox Code Playgroud)
窗口函数是否需要先对整个表执行然后应用Date>
条件否则结果是错误的?
我在SQL Server 2017中使用STRING_AGG函数。我想创建与相同的效果COUNT(DISTINCT <column>)
。我试过了,STRING_AGG(DISTINCT <column>,',')
但这不是合法的语法。
我想知道是否有T-SQL解决方法。这是我的样本:
WITH Sitings
AS
(
SELECT * FROM (VALUES
(1, 'Florida', 'Orlando', 'bird'),
(2, 'Florida', 'Orlando', 'dog'),
(3, 'Arizona', 'Phoenix', 'bird'),
(4, 'Arizona', 'Phoenix', 'dog'),
(5, 'Arizona', 'Phoenix', 'bird'),
(6, 'Arizona', 'Phoenix', 'bird'),
(7, 'Arizona', 'Phoenix', 'bird'),
(8, 'Arizona', 'Flagstaff', 'dog')
) F (ID, State, City, Siting)
)
SELECT State, City, COUNT(DISTINCT Siting) [# Of Types], STRING_AGG(Siting,',') Animals
FROM Sitings
GROUP BY State, City
Run Code Online (Sandbox Code Playgroud)
上面产生了以下结果:
+---------+-----------+--------------+-------------------------+
| State | City | …
Run Code Online (Sandbox Code Playgroud) 我有一条@a
与另一条线相交的线@b
.当我取交点并检测它是否/在哪里与@b相交时,它返回false
declare @a GEOMETRY = Geometry::STGeomFromText('LINESTRING (-83 24, -80.4907132243685 24.788632986627039)', 4326)
declare @b GEOMETRY = Geometry::STGeomFromText('LINESTRING (-74.7 21.8, -75.7 22.1, -77.8 22.6, -79.4 23.3, -80.4 24.5, -81.5 28, -84 33, -87 36)', 4326)
DECLARE @intersectionPoint geometry = @a.STIntersection(@b) -- POINT (-80.49071322436852 24.788632986627078)
IF @intersectionPoint IS NULL
THROW 50000, '@intersectionPoint not found', 1
-- Expect 1, Result 0
SELECT @b.STIntersects(@intersectionPoint)
Run Code Online (Sandbox Code Playgroud) sql ×9
sql-server ×9
.net ×1
distinct ×1
geography ×1
geometry ×1
kml ×1
linq-to-sql ×1
mysql ×1
orm ×1
row-number ×1
t-sql ×1
xml ×1