我已经在MS SQL中使用T-SQL一段时间了,不知怎的,每当我必须将数据插入表中时,我倾向于使用语法:
INSERT INTO myTable <something here>
Run Code Online (Sandbox Code Playgroud)
我知道关键字INTO在这里是可选的,我不必使用它,但不知怎的,它在我的案例中成长为习惯.
我的问题是:
INSERT语法对比有什么影响INSERT INTO吗?对于INSERT,UPDATE和DELETESQL直接对数据库执行的语句,大多数数据库提供商返回受影响的行数.对于存储过程,受影响的记录数始终为-1.
我们如何获得受存储过程影响的记录数?
比较这两个查询.将过滤器放在连接条件或are子句中是否更快.我一直认为它在连接标准上更快,因为它在最快的时刻减少了结果集,但我不确定.
我将构建一些测试来查看,但我也希望得到关于哪个更清晰易读的意见.
查询1
SELECT *
FROM TableA a
INNER JOIN TableXRef x
ON a.ID = x.TableAID
INNER JOIN TableB b
ON x.TableBID = b.ID
WHERE a.ID = 1 /* <-- Filter here? */
Run Code Online (Sandbox Code Playgroud)
查询2
SELECT *
FROM TableA a
INNER JOIN TableXRef x
ON a.ID = x.TableAID
AND a.ID = 1 /* <-- Or filter here? */
INNER JOIN TableB b
ON x.TableBID = b.ID
Run Code Online (Sandbox Code Playgroud)
编辑
我运行了一些测试,结果显示它实际上非常接近,但该WHERE条款实际上稍快一点!=)
我绝对同意在WHERE条款上应用过滤器更有意义,我只是对性能影响感到好奇.
已确认的时间标准: 143016 ms
已安排时间加入标准: 143256 ms
测试
SET …Run Code Online (Sandbox Code Playgroud) 其中[CastleType]在SQL Server中设置为数据类型"text",查询为:
SELECT *
FROM [Village]
WHERE [CastleType] = 'foo'
Run Code Online (Sandbox Code Playgroud)
我收到错误:
TEXT和VARCHAR数据类型在等于运算符中不兼容.
我是否可以使用WHERE子句查询此数据类型?
我有一些客户收到奇怪的账单.我能够找出核心问题:
SELECT 199.96 - (0.0 * FLOOR(CAST(1.0 AS DECIMAL(19, 4)) * CAST(199.96 AS DECIMAL(19, 4)))) -- 200 what the?
SELECT 199.96 - (0.0 * FLOOR(1.0 * CAST(199.96 AS DECIMAL(19, 4)))) -- 199.96
SELECT 199.96 - (0.0 * FLOOR(CAST(1.0 AS DECIMAL(19, 4)) * 199.96)) -- 199.96
SELECT 199.96 - (CAST(0.0 AS DECIMAL(19, 4)) * FLOOR(CAST(1.0 AS DECIMAL(19, 4)) * CAST(199.96 AS DECIMAL(19, 4)))) -- 199.96
SELECT 199.96 - (CAST(0.0 AS DECIMAL(19, 4)) * FLOOR(1.0 * CAST(199.96 AS DECIMAL(19, 4)))) -- 199.96 …Run Code Online (Sandbox Code Playgroud) 假设我有一个客户地址表:
CName | AddressLine
-------------------------------
John Smith | 123 Nowheresville
Jane Doe | 456 Evergreen Terrace
John Smith | 999 Somewhereelse
Joe Bloggs | 1 Second Ave
Run Code Online (Sandbox Code Playgroud)
在表中,像John Smith这样的客户可以拥有多个地址.我需要这个表的select查询只返回在'CName'中有重复项的第一行.对于这个表,它应该返回除第3个(或第1个)之外的所有行 - 这两个地址中的任何一个都可以,但只能返回一个.是否有一个关键字我可以根据服务器之前是否已经看过列值来添加到SELECT查询中进行过滤?
是否可以列出有关SQL Server上所有数据库的文件(MDF/LDF)的信息?
我想得到一个列表,显示哪个数据库正在使用本地磁盘上的文件.
我尝试了什么:
exec sp_databases 所有数据库select * from sys.databases 显示了有关每个数据库的大量信息 - 但不幸的是,它没有显示每个数据库使用的文件.select * from sys.database_files显示master数据库的mdf/ldf文件- 但不显示其他数据库如何在T-SQL中将字符串转换为日期?
我的测试用例是字符串: '24.04.2012'
我试图计算地图上两个位置之间的距离.我存储了我的数据:经度,纬度,X POS,Y POS.
我以前使用过下面的代码片段.
DECLARE @orig_lat DECIMAL
DECLARE @orig_lng DECIMAL
SET @orig_lat=53.381538 set @orig_lng=-1.463526
SELECT *,
3956 * 2 * ASIN(
SQRT( POWER(SIN((@orig_lat - abs(dest.Latitude)) * pi()/180 / 2), 2)
+ COS(@orig_lng * pi()/180 ) * COS(abs(dest.Latitude) * pi()/180)
* POWER(SIN((@orig_lng - dest.Longitude) * pi()/180 / 2), 2) ))
AS distance
--INTO #includeDistances
FROM #orig dest
Run Code Online (Sandbox Code Playgroud)
不过我不相信这个数据,它似乎给出了稍微不准确的结果.
一些示例数据,以备您需要时使用
Latitude Longitude Distance
53.429108 -2.500953 85.2981833133896
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我解决我的代码,我不介意你是否想要修复我已经拥有的东西,如果你有一种新方法可以实现这一点,那就太棒了.
请说明您的结果所在的计量单位.
我很惊讶不能在这里找到这个问题.
我有一个日期时间var,我想将它转换为一个字符串,以便我可以将它附加到另一个字符串.我希望它的格式可以很容易地转换回日期时间.
我怎样才能做到这一点?
(我想要日期部分和时间部分.)
t-sql ×10
sql-server ×9
sql ×5
math ×1
oracle ×1
plsql ×1
precision ×1
select ×1
sqldatatypes ×1
unique ×1