AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-5203

GSerg's questions

Martin Hope
GSerg
Asked: 2017-04-12 04:39:36 +0800 CST

是否从 SQL Server 2016 中秘密删除了“ActiveX 脚本”步骤类型?

  • 6

将我们的数据库从 SQL Server 2012 迁移到 2016,我们无法重新创建涉及用 VBScript 编写的 ActiveX 脚本步骤的 SQL 代理作业。

错误消息表明这'ACTIVESCRIPTING'不是@subsystem参数的允许值sp_add_jobstep。

我知道 ActiveX 脚本被标记为“将在SQL Server的未来版本中删除”。但是,在此版本的 SQL Server中,我看不到它实际上被删除的任何内容。

SQL Server 文档似乎表明它在 SQL Server 2016 中仍然可用:

  • 创建 ActiveX 脚本作业步骤 (SQL Server 2016)
  • 上的文档sp_add_jobstep,于 2017 年 3 月更新,仍然列出@subsystem ='ACTIVESCRIPTING'可用。

实际上是以无证@subsystem ='ACTIVESCRIPTING'方式秘密删除,还是我们错过了启用它的可安装组件?

sql-server-agent sql-server-2016
  • 1 个回答
  • 3066 Views
Martin Hope
GSerg
Asked: 2013-08-08 00:13:22 +0800 CST

如果使用 TRUNCATE,SSIS 包会自行阻塞

  • 4

在包级别和任务级别有一个带有Required事务的 SSIS 包。Supported包的主要部分是删除数据并插入新数据:

在此处输入图像描述

在这里,Delete块从六个表中删除所有内容,Parse块将六个文件加载到六个表中。

如果Delete使用delete from dbo.table,则一切正常,但速度很慢。
但是如果使用Deletetruncate table dbo.table来代替,删除不会花时间,但是当涉及到Parse任务时包会被阻塞。只会坐在那里无所事事。

此时在服务器端,我可以看到一个 SSIS spid 被 spid 阻止-2,这是“孤立的分布式事务”。看起来,用来表示截断连接。这个连接悬而未决,包裹被它放置的锁所阻挡。

如果我将唯一使用的 SQL Server 连接管理器切换到RetainSameConnection = True,则包一旦进入Parse任务就会失败。任务向管理器请求连接,管理器响应

[SQL Server 目标 [471]] 错误:SSIS 错误代码 DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER。对连接管理器“连接管理器”的 AcquireConnection 方法调用失败,错误代码为 0xC001A004。在此之前可能会发布错误消息,其中包含有关 AcquireConnection 方法调用失败原因的更多信息。

有没有办法设置包以便它使用truncate并且不会阻止自己?

sql-server-2008 ssis
  • 1 个回答
  • 6729 Views
Martin Hope
GSerg
Asked: 2013-07-27 09:26:04 +0800 CST

将 NULL xml 值传递给某个 CLR 存储函数会在以某种方式调用时崩溃

  • 3

考虑一个接受 XML 参数并在同一架构中调用另一个存储过程的 CLR 存储过程:

[SqlFunction(DataAccess = DataAccessKind.Read,
     IsDeterministic = false, IsPrecise = true,
     SystemDataAccess = SystemDataAccessKind.Read)]
public static SqlBoolean TestTest(SqlXml Data)
{
    using (var c = new SqlConnection("context connection=true"))
    {
        c.Open();

        using (var cmd = new SqlCommand(@"select case when exists(select 0 from [testing].WillBeCalledByCLR(@d)) then 1 else 0 end;", c))
        {
            var p = cmd.Parameters.Add("@d", SqlDbType.Xml);

            p.Direction = ParameterDirection.Input;
            if (Data.IsNull)
                { p.Value = DBNull.Value; }
            else
                { p.Value = Data; }  // Or Data.Value

            return (bool)cmd.ExecuteScalar();
        }
    }
}

此 CLR 函数在 SQL 中显示为:

create function [testing].[TestTest] ( @data xml )
returns bit
WITH CALLED ON NULL INPUT
AS
EXTERNAL NAME [Test].[Test.Test].[TestTest]

它调用的存储函数是这样的:

create function testing.WillBeCalledByCLR (@x xml = null)
returns table
as
return (
  select 1 as one, 2 as two, 'three' as three
);

在此设置中,如果我这样调用 CLR 函数:

if testing.TestTest(null) = 1
begin
  select 'Meaningful actions';
end;

或像这样:

declare @res bit = testing.TestTest(null);

或像这样:

declare @res bit;
set @res = testing.TestTest(null);

或像这样:

declare @res bit;
select @res = testing.TestTest(null);

然后我得到:

消息 2905,25 级,状态 1,第 6 行

Msg 0, Level 20, State 0, Line 0 当前命令发生严重错误。结果,如果有的话,应该丢弃。

但如果我这样称呼它:

select testing.TestTest(null);

或像这样:

declare @res bit;
set @res = (select testing.TestTest(null));

我得到了一个适当的值(例如1)。

如果null我传递了一个空字符串'',而不是 ,则在所有情况下都成功调用了该函数。

为什么?我在 CLR 函数中做错了吗?

Microsoft SQL Server 2008 (SP2) - 10.0.4000.0 (X64)
2010 年 9 月 16 日 19:43:16
版权所有 (c) 1988-2008 Microsoft Corporation
Standard Edition (64-bit) o​​n Windows NT 6.0 (Build 6002: Service Pack 2) (虚拟机)

sql-server-2008 xml
  • 1 个回答
  • 1698 Views
Martin Hope
GSerg
Asked: 2012-09-07 04:04:48 +0800 CST

CATCH 块在不应该触发的时候被触发

  • 7

在我永无休止地用保存交易搬起石头砸自己的脚的过程中,我似乎找到了更多的方法来实现这个任务的目的。这次save transaction子句本身是不行的,但正是因为它我写了下面的代码。

考虑以下带有嵌套错误处理程序的完整示例:

begin try

  begin try
    select 'Step 1';
  end try
  begin catch
    select 'Step 1 handler - handling ''' + error_message() + '''';
    goto commit_and_exit;
  end catch;

  begin try
    select 'Step 2';
    raiserror('Step 2 error', 16, 1);
  end try
  begin catch
    select 'Step 2 handler - handling ''' + error_message() + '''';
    goto commit_and_exit;
  end catch;

end try
begin catch
  select 'Outer handler - handling ''' + error_message() + '''';
  goto commit_and_exit;
end catch

commit_and_exit:

raiserror('Error raised for the caller to see', 16, 1);

据记载

GOTO语句可用于跳转到同一TRYorCATCH块内的标签或离开TRYorCATCH块。

或者可以吗?

鉴于上面的代码,一个理智的程序员会认为输出将是

Step 1
Step 2
Step 2 handler - handling 'Step 2 error'
<Error raised for the caller to see>

事实上发生的事情是:

第 1
步第 2
步第 2 步处理程序 - 处理“第 2 步错误”
外部处理程序 - 处理“引发调用者看到的
错误”<引发调用者看到的错误>

逐步调试时,我可以看到控制完全离开 try/catch 块,然后引发错误,控制返回到最外层catch块,该块执行,控制commit_and_exit:再次进入,并执行最后一个块再次。

如果您有一些commit trans 或rollback transs under commit_and_exit:,您将尝试提交 tran 两次。考虑到调用者可以启动外部事务这一事实,结果可想而知。

我还尝试end_of_outer:在 outer 之前创建另一个标签 ,end try以便控件try“正常”离开 outer 块。有趣的是,这没有任何区别。

这到底是怎么回事,正确的做法是什么?

sql-server-2008 stored-procedures
  • 1 个回答
  • 1120 Views
Martin Hope
GSerg
Asked: 2012-05-08 04:41:32 +0800 CST

将一段数据与一个会话相关联

  • 2

我想我想将一段数据与每个会话相关联。

该关联必须具有以下属性:

  • 关联的数据作为连接字符串的一部分(如果可能的话)或作为存储过程的参数提供,该存储过程必须是会话中调用的第一个 SP。
  • 数据必须可以方便地供会话随后调用的任何存储过程使用,而无需将这段数据作为参数传递。
    这一点对于这个想法至关重要:显然,我可以在每个存储过程中添加一个参数,并强制软件在每次调用任何存储过程时都传递该数据,但这正是我想要避免的。
  • 一旦会话断开,数据必须自动过期并失效。无需客户端执行任何操作即可将数据标记为已过期。如果会话意外断开,那仍然必须使其数据无效。

我考虑过几种方法,但都不喜欢:

  • 本地临时表。
    选择一个表名(基于新创建的 GUID 以避免任何冲突)。有一个存储过程,该过程使用此名称创建临时表,并插入一行数据作为参数传递。然后所有其他过程都可以引用#table并获取数据。这个想法是每个会话都有自己的#table,而名称#table保持不变。
    行不通。在存储过程中创建的临时表将在退出过程时被删除。让用户#table直接创建而不调用 SP 不是一种选择。
  • 由 @SPID 查找数据的常规表。
    行不通。这需要在断开连接时手动删除数据。
  • APP_NAME()。
    可能会工作,但这不是真正的应用程序名称,而且不容易扩展。

有没有更好的方法将数据与会话相关联?

sql-server sql-server-2008
  • 1 个回答
  • 180 Views
Martin Hope
GSerg
Asked: 2012-02-23 02:58:41 +0800 CST

保存事务:名称是否是存储过程的本地名称?

  • 2

在生产服务器上发生了一些脚射。我解决了这个问题,但我现在很困惑。

有一部分存储过程在失败时保留状态。也就是说,如果过程引发错误,它无论如何都可以安全地提交。这是用save transaction.

现在,我最初的理解是,您为事务设置的保存点名称对于使用它的存储过程来说是本地的。而在嵌套场景中,如果内部存储过程同名保存,其实是不同的名字,一切正常。

为了确保我的这种理解是正确的,我设置了一个测试用例:

create table dbo.[footest] (
  v varchar(50) NULL
);
go

insert into dbo.footest(v) values ('Nothing'); go

create procedure dbo.[foo_test_tran_inner]
as
begin
  set nocount on;

  declare @foo int;

  begin tran;

  update dbo.footest set v = 'Inner, before savepoint';

  save tran the_constant_name;

  begin try
    update dbo.footest
    set v = 'Inner, after savepoint';

    set @foo = 1/0;
  end try
  begin catch
    rollback tran the_constant_name;
  end catch;


  commit tran;

  set @foo = 1/0;

  return 0;
end;
go

create procedure dbo.[foo_test_tran_outer]
as
begin
  set nocount on;

  begin tran;

  update dbo.footest set v = 'Outer, before savepoint';


  save tran the_constant_name;

  begin try
    update dbo.footest
    set v = 'Outer, after savepoint';

    exec dbo.foo_test_tran_inner;
  end try
  begin catch
    rollback tran the_constant_name;
  end catch;



  commit tran;

  return 0;
end;
go
begin tran;
exec dbo.foo_test_tran_outer;
commit tran;
select * from dbo.footest;

这会产生“外部,在保存点之前”。这意味着,保存点名称是过程的本地名称,并且在嵌套场景中被正确回滚。


在生产中,那些保持状态的存储过程正是这种模式。其中有更多代码,但如果你删除它,只留下保存、回滚和提交,它将完全是上面显示的内容。

但。它在生产中不起作用。相反,每个具有相同名称的嵌套保存点似乎都覆盖了先前的保存点,该保存点由调用过程创建。而当最外层的代码在收到异常后执行 a commit(相信内部回滚已正确完成)时,数据库处于半螺旋状态。如果应用于上面的示例,这将意味着选择返回Inner, before savepoint。

我使用调试器逐步完成了生产过程中的每一步,并确认执行正确地完成了所有预期save tran a_name的和rollback tran a_name.

为了解决生产中的问题,我替换了这个:

save tran the_constant_name;
...
rollback tran the_constant_name;

有了这个:

declare @savepoint varchar(32) = replace(newid(), '-', '');
save tran @savepoint;
...
rollback tran @savepoint;

并立即修复它。


那么给了什么?保存点名称是否是存储过程的本地名称?
如果是,那么为什么生产代码做了它所做的事情,并且如图所示成功修复了?
如果不是,那么为什么上面的测试示例会这样做呢?

sql-server-2008 transaction
  • 1 个回答
  • 3129 Views
Martin Hope
GSerg
Asked: 2012-02-16 08:41:18 +0800 CST

过滤索引:为什么要包含过滤字段?

  • 4

这让我发疯。

考虑一个删除了不相关列的简单表:

create table boxes (
  row_id int not null identity(1,1) primary key,
  location varchar(15) null,
  dismantled bit not null default 0,
  rank int not null default 0
  /* irrelevant columns, text and numbers */
)

对于某个重要的查询,我想要一个过滤索引:

create nonclustered index anindex ON boxes (rank)
where (dismantled=0 and location is null)

这将创建一个索引,其中包含大约 150k 中的大约 150 条记录。这很好。

现在我们查询表:

select top (1) row_id
from boxes
where dismantled = 0 and location is null
order by rank;

执行计划很奇怪。索引扫描anindex伴随着书签查找,使用 seekedrow_id来确认location是null. 选择通过查找的记录。

为什么在地球上?location是null根据所用索引的定义,不是吗?

现在,如果我做了一件愚蠢的事情并包含location在过滤索引中......

create nonclustered index anindex ON boxes (location, rank)
where (dismantled=0 and location is null)

然后突然间执行计划很棒,索引搜索anindex没有查找。

这只是一个例子,每次我想使用过滤索引时都会遇到这个问题。每次我最终被迫将过滤索引的无用字段包含到索引字段列表中时,只有这样服务器才能正确使用索引;否则,它要么扫描它,要么完全忽略它。

是什么赋予了?包含无用字段是推荐的做法吗?

sql-server-2008 index
  • 1 个回答
  • 161 Views
Martin Hope
GSerg
Asked: 2012-02-05 07:49:24 +0800 CST

添加 SPARSE 使表变得更大

  • 9

我有一个通用日志表,大约 500 万行。
有一个存储事件类型的“强类型”字段,以及一堆包含与事件相关的数据的“松散类型”列。也就是说,那些“松散键入”列的含义取决于事件的类型。

这些列定义为:

USER_CHAR1 nvarchar(150) null,
USER_CHAR2 nvarchar(150) null,
USER_CHAR3 nvarchar(150) null,
USER_CHAR4 nvarchar(150) null,
USER_CHAR5 nvarchar(150) null,

USER_INTEGER1 int null,
USER_INTEGER2 int null,
USER_INTEGER3 int null,
USER_INTEGER4 int null,
USER_INTEGER5 int null,

USER_FLAG1 bit null,
USER_FLAG2 bit null,
USER_FLAG3 bit null,
USER_FLAG4 bit null,
USER_FLAG5 bit null,

USER_FLOAT1 float null,
USER_FLOAT2 float null,
USER_FLOAT3 float null,
USER_FLOAT4 float null,
USER_FLOAT5 float null

每种类型的第 1 列和第 2 列都被大量使用,但从第 3 列开始,很少有事件类型会提供这么多信息。因此,我决定将每种类型的第 3-5 列标记为SPARSE.

我先做了一些分析,发现确实,每一列中至少 80% 的数据是null,而在大约 100% 的数据中是null。根据40% 的储蓄阈值表,SPARSE对他们来说将是一个巨大的胜利。

所以我去申请SPARSE了每组的第 3-5 列。据 报告,现在我的表占用了大约 1.8Gb 的数据空间sp_spaceused,而在稀疏之前它是 1Gb。

我试过dbcc cleantable了,但没有效果。
然后dbcc shrinkdatabase,也没有效果。

感到困惑,我删除SPARSE并重复了dbccs。表的大小保持在 1.8Gb。

是什么赋予了?

sql-server sql-server-2008
  • 1 个回答
  • 1128 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve