我们最近使用这个查询在我们的数据库中查找没有聚集索引的表,发现它返回的结果之一是“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 表的存在?
我在捷克语中对重音不敏感的搜索有以下问题。我的数据库设置为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
我有一个相对较大的表,它以一种方式访问,正好通过一个查询(在读取端)。
查询按两列(均为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)
我有一个覆盖索引,主列是IsFlag1和IsFlag2。
执行计划显示并在此索引上查找索引,然后进行排序。根据执行计划,排序占查询成本的 97%。
我尝试添加SomeId为索引的主列(第三列),但执行计划保持不变。
然后我尝试添加一个仅使用 SomeId 作为主列的覆盖索引,保留原始索引。执行计划然后对新查询进行索引扫描,操作成本显着降低(并且在功能上更快)。
说了这么多,我想尽可能地优化这个查询。有没有办法修改索引,以便它简单地进行查找?
在 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) 我有一个应用程序由于超时而关闭。在这些时间里,我们看到保存 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) 下面的代码不应该返回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 数据库。我担心用户输入恶意查询*。有没有办法(通过语法检查或角色权限或其他方式)确保数据库在提供此功能时保持安全?
*忽略拒绝服务。我担心的主要是数据丢失
security best-practices permissions sql-server-2008-r2 read-only-database
我的表中有两个字段: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或者B是NULL,无论CF1和CF2也应该是NULL。
换句话说:应该只有在0,1或3的值CF1和 …
我看到有人交换了下面的代码:
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) 请考虑以下错误消息。
消息 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 Box 上有一个大表,这个表是分区的,一切都很好,直到我忘记创建新的分区范围。在第一张图片中,最后一个分区的边界为 201205110000。
201205120000 之后的所有数据都在最后一个边界 201205110000 之前,现在我想我可以创建新的边界范围,但是 fi 的情况是,如果我创建下一个边界 201205120000 sql server 将所有数据从 201205110000 复制到边界 2005,2001 年我感觉,但我不能这样做,因为我的事务日志已满。此外,特定文件(在本例中为 file_20120512)也在增长。
如果认为我可以创建最后一个边界 201206040000,然后是 201206030000,但是如果我这样做,SQL Servers tran 日志运行已满但特定数据文件 file_20120604 没有增长但 tran 日志......
我能做什么?
我在 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)
一般来说,我根本不明白这些是什么意思。你能提供一个关于这个案例的例子吗?
sql-server ×10
t-sql ×4
errors ×1
index ×1
locking ×1
null ×1
partitioning ×1
permissions ×1
profiler ×1
security ×1
session ×1
union ×1
xml ×1