小编KM.*_*KM.的帖子

SQL连接条件A = B或反向B = A?

我不认为它对数据库有任何影响,但在连接表时,您更喜欢编写条件:

SELECT
    ...
    FROM AAA
        INNER JOIN BBB ON AAA.ID=BBB.ID
    WHERE ...
Run Code Online (Sandbox Code Playgroud)

要么

SELECT
    ...
    FROM AAA
        INNER JOIN BBB ON BBB.ID=AAA.ID
    WHERE ...
Run Code Online (Sandbox Code Playgroud)

sql join

2
推荐指数
3
解决办法
3727
查看次数

多线程数据库查询

所以我们有这个最终失败的供应商(这是一个很长的故事,但请相信我),它创建了一个应用程序,它具有独立但相同的设计,我们需要查询的数据库(实际上有10个).这些数据库中的每一个都用于不同的"位置" - 但它仍然是与所有位置相关的信息.

我编写了一些代码来启动10个独特的线程来向每个单独的数据库发出查询,等待结果完成,然后将它们组合成一组可以被操作的记录.

这里的问题是,是否存在读取10个单独数据库的风险,每个数据库使用相同的凭据,一次全部?

我预计它应该是一个非问题,因为数据库在任何给定时间都可以有数百个连接,但我想在我致力于这个设计之前获得一些反馈.

MS-SQL,如果你很好奇

database sql-server multithreading

2
推荐指数
1
解决办法
2771
查看次数

SQL Server命名尾随空间是否不敏感?

我在我的OLTP中有一个Location表,在对它编码SSIS时,我找到了一个LocationCode列名,其中有一个尾随空格.

Create Table Location
(
    [LocationId] INT IDENTITY (1, 1)
    [LocationCode ] INT
)
Run Code Online (Sandbox Code Playgroud)

请注意,LocationCode列名称具有尾随空格.

然而,以下代码可行.

SELECT LocationCode
From Location
Run Code Online (Sandbox Code Playgroud)

事实上,我们找到了存储过程中使用尾随空间的几个地方,并且它继续工作.

这怎么可能?

sql t-sql sql-server

2
推荐指数
1
解决办法
398
查看次数

插入sql server中的sql_variant列

我试图从xml列向sql server中的sql_variant列插入一个值

恩.

 INSERT INTO 
  [dbo].[TestColumn]
 (
  Id,
  Attribute,
  AttributeValue
 )
 SELECT 
  Id, 
  'TestName', 
  CAST(CustomColumns.query('//TestName') AS nVarchar(MAX))
 FROM 
  [dbo].[Clmnt] (NOLOCK) 
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误,

Operand type clash: nvarchar(max) is incompatible with sql_variant
Run Code Online (Sandbox Code Playgroud)

任何人对此都有任何线索,如何在sql_variant中轻松插入值?

sql sql-server

2
推荐指数
1
解决办法
8050
查看次数

扩展第三方数据库的最佳做法?

我的情况是,我们的开发人员通过添加表,视图,存储过程和函数来扩展第三方数据库(MS SQL).最近,当供应商发布数据库更新时,他们丢弃了所有自定义对象.现在的问题是什么是一些最佳实践,它们将允许我们扩展第三方数据库,但保护我们的对象免受未来更新的影响?我的第一个想法是创建一个单独的数据库,但后来我坚持完全限定所有引用回到原始数据库,这可能会导致从测试到生产的数据库更改的问题.

database sql-server

2
推荐指数
1
解决办法
183
查看次数

使用带有IN运算符的CSV字符串时出错

当我运行以下代码时

declare @aaa nvarchar(10)
set @aaa='1,2,3'
Select * from Customer where CustomerId in (convert(nvarchar,@aaa,10))
Run Code Online (Sandbox Code Playgroud)

我收到此错误

Msg 8114, Level 16, State 5, Line 3
Error converting data type nvarchar to bigint.
Run Code Online (Sandbox Code Playgroud)

请帮助

t-sql sql-server

2
推荐指数
1
解决办法
1710
查看次数

MSSQL触发器:无法绑定多部分标识符"i.charged_amount"

好吧,我试图写一个触发器,客户试图购买东西,但如果他通过他的信用卡限制,交易必须取消.

我的表是:
客户(名称,ssn,代码),
帐户(customer_code,acc_number,余额,费率),
信用卡(已发行,已过期,限额,余额,cc_number),
交易(日期,cc_number,charge_amount,**conf_numb**呃,shop_code)

我写的是

create trigger check_balance on transactions
for insert
as
Declare @balance int,
        @limit int
SELECT @balance = balance, @limit = limit
FROM creditcard INNER JOIN inserted i ON creditcard.cc_number = i.cc_number

IF (@balance + i.charged_amount > @limit)
BEGIN

    ROLLBACK TRANSACTION
END
Run Code Online (Sandbox Code Playgroud)

但我得到了一个

消息4104,级别16,状态1,过程check_balance,行10无法绑定多部分标识符"i.charged_amount".其中第10行是IF(@balance + i.charged_amount> @limit)我知道masg意味着我不能使用i.*,因为它的范围只在select..from中.我尝试使用引用新行作为我,但我在引用附近有一个语法错误.我正在使用MSSQL server 2005我对sql中的触发器不太熟悉,所以能帮帮我吗?

sql t-sql sql-server triggers

2
推荐指数
1
解决办法
1547
查看次数

SQl Server表:要堆还是不堆?

我最近注意到我们有很多表存储在堆中(没有聚集索引).您是否会有选择地,全面地或根本不创建聚簇索引?还有其他智慧或建议吗?

有一些"代码"表有25行左右.但是,有几个行超过一百万行.

编辑 "大表",所有这些都已经有索引,只是没有聚类.一些是日志表,他们只是插入,几乎没有阅读.有一些是非常重要的,大多数只是插入,然后由应用程序读取很多次.

编辑 所有表格都有PK,我很少兴趣,它们主要只插入一次,但多次读取显示屏幕.

在其中一些表中,它们一次插入一个块或相关行中,并且在没有更新的情况下多次读取,或者组被完全删除,然后再次作为块重新插入.它们通常在某个块中读取以显示或进行计算.

在这些表的另一个"类型"中,行重复地插入相关行的组中,不同的组一直插入.在屏幕显示上,需要返回完整的组.例如,随着时间的推移插入这些行组(其中一组可以是5-50行):

 1:00pm  A1, B1, C1,
 1:30pm  A2, B2, C2,
 2:00pm  A3, B3, C3, D1
 2:30pm  A4,     C4, D2
 3:00pm          C5, D3, E1
 3:30pm              D4, E2
Run Code Online (Sandbox Code Playgroud)

屏幕需要显示完整的A:A1 + A2 + A3 + A4

编辑 基于@gbn回答关于碎片的回答,我使用了来自 marc_s的这个查询,并发现以下碎片信息为堆表有百万+行,并且被多次读取并被屏幕使用:

TableName index_type alloc_unit_type index_depth index_level avg_fragmentation_in_percent fragment_count avg_fragment_size_in_pages page_count avg_page_space_used_in_percent record_count ghost_record_count Version_ghost_record_count min_record_size_in_bytes max_record_size_in_bytes avg_record_size_in_bytes forwarded_record_count
--------- ---------- --------------- ----------- ----------- ---------------------------- -------------- -------------------------- ---------- ------------------------------ ------------ ------------------ -------------------------- ------------------------ ------------------------ ------------------------ ----------------------
TABLE_A …
Run Code Online (Sandbox Code Playgroud)

sql-server performance sql-server-2005

1
推荐指数
1
解决办法
3384
查看次数

SQL Server错误:无法对大小为x的行进行排序,这大于允许的最大值8094.但我没有排序

据我所知,"不能排序大小为9754的行,这大于允许的最大值8094".来自SQL Server的是由一行中有超过9k个字符的行引起的,这个行大于SQL Server 7中的页面大小限制.但是我没有通过下面的数据调用一个命令,所以为什么错误说它不能排序?

SELECT <a number of columns...>
FROM Category10Master c10
JOIN Category20Master c20 ON c10.Cat10ID = c20.ParentCatID 
JOIN Category25Master c25 ON c20.Cat20ID = c25.ParentCatID 
JOIN Category30Master c30 ON c25.Cat25ID = c30 .ParentCatID 
JOIN Item i ON c30.Cat30ID = i.ParentCatID
Run Code Online (Sandbox Code Playgroud)

编辑:是的,我知道我可以调用更少的列来解决这个问题 - 实际的查询显式调用所需的列,但仍超过行大小限制.这实际上是在一个被称为站点范围的视图中,因此更改视图以缩回更少的列不是一个有吸引力的选项 - 需要修改数十个页面以从视图以外的其他位置获取数据.我不幸的是已经把一个丑陋的设计搞得一团糟,我希望有人能提供比吸引更少数据更有吸引力的解决方案.

database sql-server sql-server-7

1
推荐指数
1
解决办法
2369
查看次数

兼容模式是否允许新命令?

我有一台以2012兼容模式运行数据库的SQL Server 2017服务器。但是,当我尝试使用2017 T-SQL的新命令时string_agg(),它可以工作。我预计会出现语法错误,因为string_agg()对于2012模式无效。

这是我正在使用的SQL:

SELECT
    Compatibility_Level,
    CASE Compatibility_Level
       WHEN 65 THEN 'SQL Server 6.5'
       WHEN 70 THEN 'SQL Server 7.0'
       WHEN 80 THEN 'SQL Server 2000'
       WHEN 90 THEN 'SQL Server 2005'
       WHEN 100 THEN 'SQL Server 2008/R2'
       WHEN 110 THEN 'SQL Server 2012'
       WHEN 120 THEN 'SQL Server 2014'
       WHEN 130 THEN 'SQL Server 2016'
       WHEN 140 THEN 'SQL Server 2017 <<<'
       ELSE 'new unknown - ' + CONVERT(VARCHAR(10), Compatibility_Level)
    END AS VersionName
FROM …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server sql-server-2012 sql-server-2017

1
推荐指数
1
解决办法
117
查看次数