标签: sql-server-2008

在镜像主体上增长的事务日志

我有一对 SQL Server 2008 R2 服务器托管一个没有见证的同步镜像数据库。这个周末,我们不得不做一些网络维护,所以我暂停了镜像。恢复后,委托人的状态恢复为通常的委托人,已同步。然而,镜像现在显示为镜像、同步/恢复......我不记得恢复......部分通常在那里。

尽管每小时进行日志备份,但主体上的事务日志也开始增长。这向我表明同步过程没有释放事务日志空间。

这里发生了什么,我该如何解决?

sql-server-2008 sql-server mirroring sql-server-2008-r2

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

多列串联

如何将多列连接成一行?例如:

id   name    car
1    sam     dodge
1    ram     maserati
1    john    benz
1    NULL    mazda
2    kirk    lexus
2    Jim     rolls
1            GMC
Run Code Online (Sandbox Code Playgroud)

预期的结果集是:

ID  name               car
1   sam,ram,john       dodge,maserati,benz,mazda,GMC
2   kirk,jim           lexus,rolls
Run Code Online (Sandbox Code Playgroud)

使用我在 Stack Overflow 上找到的解决方案

SELECT * FROM (
SELECT t.id,stuff([m].query('/name').value('/', 'varchar(max)'),1,1,'') AS [SomeField_Combined1],
stuff([m].query('/car').value('/', 'varchar(max)'),1,1,'') AS [SomeField_Combined2]
FROM dbo.test t
OUTER apply(SELECT (

SELECT id, ','+name AS name
,','+car AS car
FROM test WHERE test.id=t.id
FOR XML PATH('') ,type)
             AS  M) A)S
GROUP BY …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server t-sql

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

无法使用 powershell 获取数据库或其对象

我的服务器和开发电脑都安装了 Powershell。在我的开发机器上,显然安装了最新版本的 PowerShell 或其某些 SQL Server 'sqlps' 组件。我目前的问题是我无法像在开发机器中那样列出数据库,如下所示:

PS SQLSERVER:\> ls SQLSERVER:\\SQL\server\instance\Databases\
Run Code Online (Sandbox Code Playgroud)

我得到以下信息:

Get-ChildItem : No se encuentra la ruta de acceso 'SQLSERVER:\SQL\serverr2\serverr2\Databases' porque no existe.
En línea: 1 Carácter: 4
+ dir <<<<  SQLSERVER:\SQL\server\instance\Databases
    + CategoryInfo          : ObjectNotFound: (SQLSERVER:\SQL\server\instance\Databases:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
Run Code Online (Sandbox Code Playgroud)

显然,我无法获得诸如存储过程、视图等之类的子项。

但是,我可以列出已安装的实例,并且还可以通过列出带有以下内容的数据库来解决此问题:

DIR SQLSERVER:\\SQL\serverr2 | SELECT Databases -ExpandProperty Databases | SELECT Name,Owner,Urn
Run Code Online (Sandbox Code Playgroud)

但仍然需要获取另一个对象,如存储过程、视图、函数等。

这是 Get-Host cmdlet 提供的信息

Name             : ConsoleHost
Version          : 2.0
InstanceId       : c1976472-19c0-439e-a4f6-debe59a18616
UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture   : es-MX
CurrentUICulture : …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server powershell

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

如何使数据库备份更快?

我最近参加了下一份工作的面试,并被问到:

如何在 SQL Server 中加快大小接近 1TB 或 800 GB 的数据库的备份?

我的回答:我们可以使用数据库压缩或使用 Light Speed 之类的第三方工具。

但他们期待这个我不知道的答案:

解决方案:通过添加更多目标文件来提高吞吐量

例子

我通过添加更多备份目标文件创建了这个示例脚本:

DBCC TRACEON (3605, -1) 
DBCC TRACEON (3213, -1) 

BACKUP DATABASE [AdventureWorks2008] TO 
    DISK = N'E:\ADWBackup\AdventureWorks2008-Full.bak',
    DISK = N'E:\ADWBackup\AdventureWorks2008-Full-File2.bak', 
    DISK = N'E:\ADWBackup\AdventureWorks2008-Full-File3.bak'
WITH 
    NOFORMAT, INIT, NAME = N'AdventureWorks2008-Full Database Backup', 
    SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10 

DBCC TRACEOFF(3605, -1) 
DBCC TRACEOFF(3213, -1)
Run Code Online (Sandbox Code Playgroud)

能否请您回答以下问题:

  1. 遵循这种方法而不是使用单个文件有什么用?
  2. 如果我这样做会有任何时差吗?
  3. 如何使用多个拆分文件恢复数据库?
  4. 真的会提高备份速度吗?

sql-server-2008 sql-server backup

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

为什么在备份期间不能收缩事务日志?

我有一个简单恢复模式的大型数据库(供应商要求),花了 3 天时间将其备份到新托管公司的服务器。

第三天早上,由于事务日志已填满其驱动器,DB 下线。

我的理解是 SQL Server 将开始回收空间。更有趣的是,在我给它更多空间之前,我认为数据库不会再次开始工作——它在备份完成后仍然被破坏。不过,我没有花时间进行正确的调试,所以我不知道为什么会卡住。

问题:为什么 SQL Server 在 Simple Recovery 中不能在备份时回收其事务日志?

sql-server-2008 sql-server

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

在sql server中从同一台服务器上的另一个数据库实例中选择数据

我有一个查询如下所示:

select count(*) as Count, datepart(yyyy, [LogDate]) as [Year]
from ViewAssociate..Auth_Log 
where ActionCode = 12
group by datepart(yyyy, [LogDate])
order by [Year]
Run Code Online (Sandbox Code Playgroud)

此查询是基于 ReadAssociate 数据库的存储过程的一部分。它试图从 ViewAssociate 数据库中获取数据。尝试运行存储过程的用户无权访问 ViewAssociate 数据库,因此查询会引发错误。

我的问题是我能否以某种方式修改查询并为其提供用户名密码以运行,以便我可以从 ViewAssociate Db 获取数据。有人建议,Execute As但这似乎不起作用。

execute as login = 'viewassociate' 我收到此错误:

无法作为服务器主体执行,因为主体“viewassociate”不存在,无法模拟此类主体,或者您没有权限。

该 viewassociate 是一个 sql 登录,它属于db_ownerViewAssociate 数据库。

sql-server-2008 sql-server permissions

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

为什么我收到此请求的错误“在预期条件的上下文中指定的非布尔类型”?

我收到此错误:
"Error 102 : non-boolean type specified in a context where a condition is expected"
对于此请求:

DECLARE @num_dossiers TABLE (num_dossier INT,indice NVARCHAR(3))
insert into @num_dossiers
select num_dossier,indice from dossier where num_sec=57

delete from constitue where (num_dossier,indice) in select (num_dossier,indice) from @num_dossiers  
Run Code Online (Sandbox Code Playgroud)

触发错误的请求是最后一个:

delete from constitue where (num_dossier,indice) in select (num_dossier,indice) from @num_dossiers   
Run Code Online (Sandbox Code Playgroud)

导致此错误的原因可能是什么?

sql-server-2008 sql-server

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

兼容级别 80 和 100 之间的可变长度字符串问题

在我当前的企业中,我遇到了大量与特定场景相关的问题。

我们有一个 SQL Server 2008,我们想迁移到 SQL Server 2016,所以我们将兼容性从 80 迁移到 100,但是我们的一些存储过程有问题,如下代码所示:

CREATE TABLE #PRUEBA (texto1 char(30), condicion char(30)) 
INSERT INTO  #PRUEBA VALUES ('PFI','1') 
INSERT INTO #PRUEBA VALUES ('CFI','2') 
SELECT 
    CASE
        WHEN condicion= '1' THEN texto1 
        ELSE 'TFI'
    END 
FROM  #PRUEBA 
DROP TABLE #PRUEBA
Run Code Online (Sandbox Code Playgroud)

兼容性 -> 80

'PFI                           ' -> char of 30 length 
'TFI                           ' -> char of 30 length
Run Code Online (Sandbox Code Playgroud)

兼容性 -> 90

'PFI                           ' -> varchar of 30 length
'TFI'                            -> varchar of 3 length
Run Code Online (Sandbox Code Playgroud)

兼容性 -> 100

'PFI …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server varchar sql-server-2016 compatibility-level

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

是否可以根据 select+where 的结果为列添加别名?

我有一张这样的表:

TB1:

COD | A001 | A002 | A003
 1    cars   baby   nasa
Run Code Online (Sandbox Code Playgroud)

然后是第二张桌子:

TB2:

COD | NO_COL_TB1 | DESCRIPTION |
 1  |    A001    |  Something
 2  |    A002    |   lasagna
Run Code Online (Sandbox Code Playgroud)

我正在尝试做的是这样的事情(显然这不起作用)

select A001 as (select description from TB2 WHERE no_col_tb1= A001 )
      ,A002 AS (select description from TB2 WHERE no_col_tb1= A002 )
from TB1
Run Code Online (Sandbox Code Playgroud)

我尝试使用内部连接和一些动态 sql,但我无法思考这个逻辑。有一些关于此的问题,但没有一个可以帮助我。我认为这是不可能用单个语句完成的,只能用动态 SQL 来完成。

编辑:

正确的结果是:

SELECT COD,
       TB1.A001 AS 'Something',
       TB1.A002 AS 'Lasagna'
FROM TB1
Run Code Online (Sandbox Code Playgroud)

结果将是:

COD |SOMETHING | LASAGNA |
 1      cars       baby
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server

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

保持旧数据库 (SQL 2008) 中的数据与新数据库 (SQL 2016) 相同?

我正在将数据库移动到新服务器。

新服务器运行 SQL Server 2016,当前服务器运行 SQL Server 2008。

我需要在几周内制定备份/后备计划(以防出现问题 - 我可以将我的应用程序切换回 2008 Server 并继续工作)。

我想知道是否可以启用复制(或替代方案?)并使所有事务/合并在 2008 实例上同步,以便两个数据库都是最新的,以防我需要切换到旧数据库?

由于业务需求,我们必须能够回退到 SQL Server 2008。这是没有商量余地的。

replication sql-server-2008 sql-server sql-server-2016

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