小编Mar*_*ith的帖子

为什么“sysfiles1”会出现在 SQL Server 2008 的 sys.objects 目录视图中?

我们最近使用这个查询在我们的数据库中查找没有聚集索引的表,发现它返回的结果之一是“sys.sysfiles1”表。我们正在运行 SQL Server 2008,我的印象是该表不再使用(正如一些答案指出的那样,似乎存在一种误解,即该表仅存在于从 SQL Server 2000 升级的数据库)。此外,我无法直接从 sys.sysfiles1 表中选择任何内容(尽管我可以直接从 sys.sysfiles 视图中选择)。

运行以下命令以针对本地安装的 SQL Server 2008 (@@version = Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64),尽管我们已经在 SQL Server 的生产实例中看到它) 创建一个新数据库2008 年)也说明了我的意思:

CREATE DATABASE SysFilesTesting
--returns a row:
SELECT * FROM SysFilesTesting.sys.objects where name = 'sysfiles1'
--throws 'invalid object name' error:
SELECT * FROM SysFilesTesting.sys.sysfiles1
Run Code Online (Sandbox Code Playgroud)

为什么 sys.objects 报告 sysfiles1 表的存在?

sql-server-2008 sql-server

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

MS SQL Server 2008 R2 中的捷克语排序规则 Czech_CI_AI 的问题

我在捷克语中对重音不敏感的搜索有以下问题。我的数据库设置为Czech_CI_AI整理。对于某些变音符号系统正常工作(即I),但对于某些不正常(即R)。在我的数据库中有几条'DVORA*'记录:

SELECT contact_name 
FROM   CONTCTSM1 
WHERE  CONTACT_NAME LIKE 'DVO%' 
Run Code Online (Sandbox Code Playgroud)

结果:

DVO?Á?KOVÁ,
IVETA DVO?Á?KOVÁ,
JI?INA DVO?ÁK

sql-server-2008 t-sql

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

WHERE X <> 1 AND Y <> 1 ORDER BY Z 的正确索引

我有一个相对较大的表,它以一种方式访问​​,正好通过一个查询(在读取端)。

查询按两列(均为bit)过滤表,并按第三列(整数)排序​​。请注意,查询命名列(它实际上不使用“*”)。“TOP 1000”是有意的,是生产查询的一部分:

生成了查询——不知道为什么它会以这种方式生成。

SELECT TOP 1000
     *
FROM
     MyTable m
WHERE
     m.IsFlag1 != 1
     AND m.IsFlag2 != 1
ORDER BY
     m.SomeId
Run Code Online (Sandbox Code Playgroud)

我有一个覆盖索引,主列是IsFlag1IsFlag2

执行计划显示并在此索引上查找索引,然后进行排序。根据执行计划,排序占查询成本的 97%。

我尝试添加SomeId为索引的主列(第三列),但执行计划保持不变。

然后我尝试添加一个仅使用 SomeId 作为主列的覆盖索引,保留原始索引。执行计划然后对新查询进行索引扫描,操作成本显着降低(并且在功能上更快)。

说了这么多,我想尽可能地优化这个查询。有没有办法修改索引,以便它简单地进行查找?

index sql-server-2008 sql-server

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

遍历所有非系统数据库并清空它们

在 SQL Server 2012 上......我在用于培训目的的服务器上有多个数据库。这些需要定期清除以重新开始。当数据库数量很少时,我会使用 Adam Anderson 的代码删除所有对象并手动更改 USE 语句。现在有 200 多个数据库,我宁愿不要。希望自动化这个过程。我正在尝试使用 sp_MSforeachdb,但到目前为止还没有运气。有什么建议?提前致谢!

DECLARE @command nvarchar(max) 

SELECT @command ='IF EXISTS 
(
    SELECT 1
    FROM sys.databases
    WHERE name = ''?'' 
    AND name LIKE ''learndb%''        --we have learndb1, learndb2, etc...
)
BEGIN

DECLARE @stmt nvarchar(max)
DECLARE @n char(1)
SET @n = char(10)

select @stmt = isnull( @stmt + @n, '''' ) +
    ''drop procedure ['' + schema_name(schema_id) + ''].['' + name + '']''
from sys.procedures

select @stmt = isnull( @stmt + @n, …
Run Code Online (Sandbox Code Playgroud)

sql-server

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

使用阻塞进程报告诊断阻塞问题

我有一个应用程序由于超时而关闭。在这些时间里,我们看到保存 ASP 会话状态的数据库的响应时间大幅增加。

为了诊断问题,我使用SP_CONFIGURE'blocked process threshold',15并运行跟踪以捕获任何触发的事件。在下一个事件期间,跟踪捕获会话状态数据库中的一些阻塞事件。

我已经确定了主要拦截器,可以看到它已暂停并等待。

<blocked-process-report>
    <blocked-process>
        <process id="process53fb4c8" 
                 taskpriority="0" logused="0" 
                 waitresource="KEY: 10:72057594039238656 (594b17b7493c)" waittime="20631"
                 ownerId="9710782702" transactionname="UPDATE" 
                 lasttranstarted="2013-06-27T17:29:38.130" XDES="0xc429df950" lockMode="U" 
                 schedulerid="14" kpid="6912" status="suspended" spid="359" sbid="0" ecid="0" 
                 priority="0" trancount="2" lastbatchstarted="2013-06-27T17:29:38.130"
                 lastbatchcompleted="2013-06-27T17:29:38.107" 
                 clientapp=".Net SqlClient Data Provider" hostname="WEB03" hostpid="7520" 
                 loginname="State" isolationlevel="read committed (2)" xactid="9710782702" 
                 currentdb="10" lockTimeout="4294967295" 
                 clientoption1="536870944" clientoption2="128056">
            <executionStack>
                <frame line="18" stmtstart="1114" stmtend="4494" 
                       sqlhandle="0x03000a00210f020741a1be0058a000000100000000000000"/>
            </executionStack>
            <inputbuf>
                Proc [Database Id = 10 Object Id = 117575457]
            </inputbuf>
        </process>
    </blocked-process>
    <blocking-process>
        <process status="suspended" waittime="1046" spid="217" sbid="0" ecid="0" 
                 priority="0" trancount="1" lastbatchstarted="2013-06-27T17:29:29.113" 
                 lastbatchcompleted="2013-06-27T17:29:29.010" …
Run Code Online (Sandbox Code Playgroud)

sql-server profiler locking session

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

SQL Server 替换未返回预期结果

下面的代码不应该返回0吗?

SELECT REPLACE(ISNULL('',0),'',0)
Run Code Online (Sandbox Code Playgroud)

这也不返回0....

SELECT REPLACE('','',0)
Run Code Online (Sandbox Code Playgroud)

我在包含数值的表中有一个 nvarchar 字段,但有时为空(不为空)。

我有一个查询,检查该字段是否<另一个字段中的数字,但我得到

“将数据类型 nvarchar 转换为数字时出错。”

如果该字段为空,则会出错。我试图在查询执行期间将空白值 ('') 转换为零,这样我就不会收到转换错误,但我刚刚意识到

SELECT REPLACE('','',0)
Run Code Online (Sandbox Code Playgroud)

不会将空白字段转换为 0。

我尝试使用下面的代码来尝试避免转换错误,但是当阈值字段为空时它没有像我预期的那样评估为 0:

SELECT CAST(REPLACE(ISNULL(Threshold,0),'',0) as decimal(4,2))
Run Code Online (Sandbox Code Playgroud)

当阈值字段为空时,如何让代码评估为 0。

我猜我可以写一个 if 或 case 语句来跳过空白 ('') 值阈值,但我认为必须有一种方法可以全部内联,就像我试图用上面的代码做的那样.

sql-server

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

对用户定义查询的限制

我有一个客户希望我实现一个网页,该网页允许用户在文本框中输入自定义查询,以便他们可以直接查询 SQL Server 数据库。我担心用户输入恶意查询*。有没有办法(通过语法检查或角色权限或其他方式)确保数据库在提供此功能时保持安全?

*忽略拒绝服务。我担心的主要是数据丢失

security best-practices permissions sql-server-2008-r2 read-only-database

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

NULL 时的计算字段

我的表中有两个字段:A int, B int。我想添加两个使用这两个字段& 的计算字段 ( CF1& CF2) 。AB

CF1 = (case when [A]>[B] then (CF1=3) else case when [A]<[B] then (CF1=0) else (CF1=1) end end)

CF2 = (case when [A]<[B] then (CF2=3) else case when [A]>[B] then (CF2=0) else (CF2=1) end end)
Run Code Online (Sandbox Code Playgroud)

这工作正常,但是当两个字段 ( A& B) 是NULL,CF1并且CF2是 = 1 时。如何避免这种情况?我的意思是,当领域中的任意一个A或者BNULL,无论CF1CF2也应该是NULL

换句话说:应该只有在0,1或3的值CF1和 …

null sql-server t-sql computed-column

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

我们可以用 UNION ALL 来交换逻辑或吗?

我看到有人交换了下面的代码:

SELECT
    PK1
    , PK2
    , PK3
    , PK4
    , C
    , B
    , SUM(NUMERIC_1)
    , SUM(NUMERIC_2)
    , MAX(NUMERIC_3)
    , SUM(NUMERIC_4)
FROM MATDOC_EXTRACT
WHERE A = ''
      AND (
          (
              (
              B = ''
              OR B = 'K'
          )
              AND (
                  C = '01'
                  OR C = '02'
                  OR C = '07'
                  OR C = '08'
              )
          )
          OR (
              B = ''
              AND (
                  C = '03'
                  OR C = '04'
              )
          )
      )
GROUP BY PK1
         , PK2 …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql union

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

如何区分运行时错误和其他错误?

请考虑以下错误消息。

消息 207 级别 16 状态 1 第 7 行

列名“FOO”无效。

由于我触发它的方式,我碰巧知道这是一个解析/编译时错误。

假设我正在运行一个不属于过程的长脚本,并且我收到了相同的错误消息。此错误消息中的内容告诉我错误是在解析/编译时而不是运行时发生的?


CREATE TABLE Department_History
(
    DepartmentNumber INT
);
GO

ALTER TABLE Department_History ADD FOO INT;

-- This is fine and shows FOO.
SELECT * FROM Department_History;

-- When uncommented, this fails at parse time.
INSERT Department_History (DepartmentNumber, FOO) VALUES (4, 5), (6, 7), (8, 9);
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql errors

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

非常大的分区表的奇怪情况

我这里有一个非常奇怪的情况......

在我的 SQL Box 上有一个大表,这个表是分区的,一切都很好,直到我忘记创建新的分区范围。在第一张图片中,最后一个分区的边界为 201205110000。

201205120000 之后的所有数据都在最后一个边界 201205110000 之前,现在我想我可以创建新的边界范围,但是 fi 的情况是,如果我创建下一个边界 201205120000 sql server 将所有数据从 201205110000 复制到边界 2005,2001 年我感觉,但我不能这样做,因为我的事务日志已满。此外,特定文件(在本例中为 file_20120512)也在增长。

如果认为我可以创建最后一个边界 201206040000,然后是 201206030000,但是如果我这样做,SQL Servers tran 日志运行已满但特定数据文件 file_20120604 没有增长但 tran 日志......

我能做什么?

sql-server partitioning

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

获取 XML 的属性值

我在 SE 上至少回答了 5 个问题,但我一定已经因为沮丧而做了一些非常糟糕的事情。

我有一个存储过程,它返回这样的 XML:

<pmsg:Messages>
    <pmsg:Message Info="blah" />
</pmsg:Messages>
Run Code Online (Sandbox Code Playgroud)

我需要获取Info.

DECLARE @xmlMessage XML;

EXEC procReturnsXml @xmlMessage OUTPUT;

 -- returns 0 rows
WITH XMLNAMESPACES('pmsg' AS pmsg)
SELECT msgs.msg.value('@Info', 'nvarchar(max)')
FROM   @xmlMessage.nodes('pmsg:Messages/pmsg:Message') msgs(msg);

 -- returns NULL
WITH XMLNAMESPACES('pmsg' AS pmsg)   
SELECT @xmlMessage.value('(/pmsg:Messages/pmsg:Message/@Info)[1]', 'nvarchar(max)');

-- returns NULL
WITH XMLNAMESPACES('pmsg' AS pmsg)  
SELECT t.x.value('(/pmsg:Messages/pmsg:Message/@Info)[1]', 'nvarchar(max)') AS INFO
FROM   @xmlMessage.nodes('/*') t(x); 
Run Code Online (Sandbox Code Playgroud)

一般来说,我根本不明白这些是什么意思。你能提供一个关于这个案例的例子吗?

xml sql-server

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