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-79720

JohnG's questions

Martin Hope
JohnG
Asked: 2024-11-22 03:51:54 +0800 CST

查询标记用户:需要 SQL2022 更新

  • 5

我的软件与 SQL2016 及更高版本(包括 SQL Azure)兼容,当 SQL 2022 低于版本 16.0.1135.2 或低于 16.0.4165.4 时会崩溃 - 取决于 RTM、GDR、CU(我很难理解 MS 使用的版本架构)

我编写此代码是为了查明是否需要 SQL 更新

-- if it's Version 16
IF (select substring(convert(varchar(20),SERVERPROPERTY('productversion')),1,charindex('.',convert(varchar(20),SERVERPROPERTY('productversion')))-1))='16'
-- If so is it 16.0.1xxxxxxx or 16.0.4xxxxxxxx
    IF (select substring(convert(varchar(20),SERVERPROPERTY('productversion')),1,charindex('16.0.',convert(varchar(20),SERVERPROPERTY('productversion')))))='1'
-- if 16.0.1 it needs to be < 16.0.1135.2 
BEGIN 
        if (select substring(convert(varchar(20),SERVERPROPERTY('productversion')),charindex('16.0.',convert(varchar(20),SERVERPROPERTY('productversion'))),len(convert(varchar(20),SERVERPROPERTY('productversion')))))<'16.0.1135.2'
 select 1
END
ELSE 
BEGIN 
-- if 16.0.4 it needs to be < 16.0.4165.4 
        IF (select substring(convert(varchar(20),SERVERPROPERTY('productversion')),1,charindex('16.0.',convert(varchar(20),SERVERPROPERTY('productversion')))))='4'
            if (select substring(convert(varchar(20),SERVERPROPERTY('productversion')),charindex('16.0.',convert(varchar(20),SERVERPROPERTY('productversion'))),len(convert(varchar(20),SERVERPROPERTY('productversion')))))<'16.0.4165.4'
            select 1 
END 

我的问题是,在 16.0.YYYY.z 中,我认为我不能依赖第一个 Y 来告诉我应该查看哪个分支,因为查看以前的 SQL 版本,在同一个分支中,第一个 Y 可以更改数字...我要查找的是 2024-11-12 之前更新的 2 个版本,如果安装的 SQL2022 版本不包含 2024-11-12 的更新,我希望被标记

  1. 是否存在我可以遵循的标准或者是否有更好的方法来做到这一点?
  2. 我是否应该担心 Azure 或者我可以假设 Azure 始终是最新的?

我们想让用户知道他们至少需要 16.0.1135.2 或 16.0.4165.4。我担心的是在查询中选择分支(='1' 或 ='4')。我不认为它会随着时间的推移而变得可靠(数字可能会改变),因为我不确定 MS 使用的惯例。

该软件拥有超过 30,000 个脚本(开发时间超过 30 年)和数千个客户。升级由专家完成(而不是由客户完成)。由于它每年更新四次,因此如果我们发现 SQL 服务器不兼容,我们希望在升级过程中添加警告,以便专家可以采取行动。

sql-server
  • 2 个回答
  • 55 Views
Martin Hope
JohnG
Asked: 2021-04-29 10:59:31 +0800 CST

一个脚本中的多个 Set Quoted_identifier 采用最后一个?

  • 4

我正在使用 SQL Server 2019,但发现了一个奇怪的行为。研究并没有让我更进一步。

有人可以解释这种行为吗?

SET QUOTED_IDENTIFIER ON; 
if ((256 & @@options) = 256) print '1- quoted_identifier is on' else print '1- quoted_identifier is off';
BEGIN TRY 
    if ((256 & @@options) = 256) print '2- quoted_identifier is on' else print '2- quoted_identifier is off';
END TRY 
BEGIN CATCH
    if ((256 & @@options) = 256) print '3- quoted_identifier is on' else print '3- quoted_identifier is off';
    -- SET QUOTED_IDENTIFIER OFF
    -- if ((256 & @@options) = 256) print '4- quoted_identifier is on' else print '4- quoted_identifier is off';
END CATCH

回报:

1- quoted_identifier is on
2- quoted_identifier is on

但以下代码:

SET QUOTED_IDENTIFIER ON; 
if ((256 & @@options) = 256) print '1- quoted_identifier is on' else print '1- quoted_identifier is off';
BEGIN TRY 
    if ((256 & @@options) = 256) print '2- quoted_identifier is on' else print '2- quoted_identifier is off';
END TRY 
BEGIN CATCH
    if ((256 & @@options) = 256) print '3- quoted_identifier is on' else print '3- quoted_identifier is off';
    SET QUOTED_IDENTIFIER OFF
    if ((256 & @@options) = 256) print '4- quoted_identifier is on' else print '4- quoted_identifier is off';
END CATCH

回报:

1- quoted_identifier is off
2- quoted_identifier is off

即使它没有进入捕获!我肯定错过了什么。

我什至能够将代码简化为最简单的:

SET QUOTED_IDENTIFIER ON; 
if ((256 & @@options) = 256) print '1- quoted_identifier is on' else print '1- quoted_identifier is off';
SET QUOTED_IDENTIFIER OFF
if ((256 & @@options) = 256) print '2- quoted_identifier is on' else print '2- quoted_identifier is off';

结果:

1- quoted_identifier is off
2- quoted_identifier is off

我有一些使用 的代码FOR XML,这需要我将带引号的标识符设置为 ON,但无论 XML 部分成功还是失败,我都需要将其设置回 OFF。你会怎么做?

我的测试表明,如果我在SET QUOTED_IDENTIFIER中关闭 to CATCH,插入无法说明我引用的标识符没有正确设置,尽管它设置在TRYto的开头ON。

sql-server t-sql
  • 2 个回答
  • 188 Views
Martin Hope
JohnG
Asked: 2020-08-27 12:01:54 +0800 CST

EXEC动态SQL的TSQL成功或失败结果

  • 1

基于以下代码:

/* This SP takes a query and a unique temporary table name as input... 
The outputs is a string with the command to create the tmp table based on the query that is given in the @SRC parameter 
*/ 
EXEC dbo.createTmpFromQuery @SRC,@uniqueTMP,@createTmpStr=@SQLStr OUTPUT
/* This executed the query that will create the tmp table and insert the data from @SRC */
EXEC(@SQLStr)

调用这 2 行(以及许多其他行)的整个存储过程位于 Try Catch 中。我刚刚遇到了一个问题,@SRC 中的查询有一个语法错误,称为 Catch 部分:

BEGIN CATCH
        ROLLBACK TRANSACTION;
        SET @ERRORMESSAGE=CASE WHEN @ERRORMESSAGE='' THEN ERROR_MESSAGE() ELSE @ERRORMESSAGE END 
        RAISERROR (@ERRORMESSAGE,16,1)
END CATCH

Try 有很多验证,我在大多数情况下将 @ErrorMessage 设置为个性化消息。在这种情况下,我想设置个性化消息而不是获取标准错误消息

(example): Incorrect syntax near 'FROM'.

我试图弄清楚如何让 EXEC(@SqlStr) 返回成功或失败代码,因此我可以在 @ErrorMessage 进入代码的捕获部分之前设置它。

sql-server t-sql
  • 1 个回答
  • 557 Views
Martin Hope
JohnG
Asked: 2020-08-15 09:04:48 +0800 CST

SQL Server 在线维护——虚假宣传?

  • 0

我受到了挑战,因为我们的客户在运行本应在线维护的过程中遇到了不同类型的错误。超时、扫描因数据移动而停止等错误。

我们的一些客户购买了 SQL Server 企业版,以便能够获得重建索引在线功能。

为了重现这些问题,我一直在一个大型数据库上测试 dbcc checkdb,重组和重建索引以及更新统计信息,同时我在一个几乎 1TB 的数据库上使用事务轰炸服务器。

我的第一个测试是使用 maxdop=1 的 checkdb,而 sqlServer 正在处理 124000 个小事务...我从我的应用程序收到超时设置为 5 分钟。研究检查数据库的工作方式,即创建快照,密集使用 tempdb 并创建 nolocks 来创建快照......那么如果我的一个小事务不锁定表,它怎么能被阻止呢?

我的第二个测试是在处理 124000 个事务时重新组织所有索引(也应该是在线的),这次我遇到了死锁......

我的第三个测试是在运行 124000 个事务时使用 maxdop=1 更新所有统计信息。在这种情况下收到的错误是:Could not continue scan with no lock due to data move

我在运行 124000 个事务时在线重建所有索引的第四次测试将很快运行,我将用结果更新我的帖子。

我在可以使用的地方使用的 maxdop=1 是为了消除资源争用。

我已经阅读了多篇文章,其中包括 Paul Randal 对重建索引的在线与离线的解释,并了解其中的区别......但正如我所说,我面临着解释为什么它不是真正在线的挑战,尽管微软声称它是在线的.

任何输入将不胜感激。

我错过了什么

sql-server maintenance
  • 1 个回答
  • 75 Views
Martin Hope
JohnG
Asked: 2018-10-27 06:06:57 +0800 CST

使用校验和与 Binary_checksum 验证数据

  • 0

基于这篇文章,我能够通过添加索引来解决性能问题,并认为我完成了我的项目,直到我遇到校验和问题......然后我做了研究(应该在我开始项目之前完成)并且发现checksum 和 binary_checksum 在系统关键环境中不可靠。

我正在寻找一种可靠的方法来计算商店中一张表的数据,然后将其与总部的同一张表进行比较。

正如上面提到的帖子中所解释的,数据文件在发生时从多个商店(交易)传输到总部。对于每家商店,所讨论的表格都非常大。在总部,同一张表包含来自所有商店的相同信息,这使得它变得非常庞大。数据通过文件传输,因为 HO 和商店之间没有任何直接连接。理想情况下,如果我可以从商店传输所有数据,逐行并将其与总部的表格进行比较,那将是很棒的,但这是不可想象的,因为它太大了。

我尝试HASHBYTES通过将列转换为字符串来使用,但发现它在 SQL Server 2014 之前有 8000 个字符的限制。我们的系统必须支持从 2008 年到今天的任何版本的 SQL Server。

我正在尝试找到一种可靠的方法来获取某种类型的聚合校验和值,该校验和值可以逐个在每个商店和他们的 head_office 表之间进行比较。

更新:我试过使用 Hashbyte,但它在我的情况下不起作用,因为由于每家商店和总部之间的数据量,我没有逐行比较。示例:如果一家商店的表有 100 000 行,那么拥有 10 家商店信息的总部将在同一张表中包含 1 000 000 行......我无法将所有行从商店发送到总部只是为了比较并确保所有数据已成功传输。所以我的想法是在每个日期聚合商店的信息,并将其与总部同一家商店的相同聚合进行比较,如果我发现不匹配,我有一个流程被触发以从商店请求信息具体日期到总部。

我很高兴找到校验和的 Checksum_agg,它就是这样做的……但是在阅读和测试不同的场景(例如 checksum(100.00) 给出与 checksum(10.00) 相同的结果)之后,它扼杀了我的整个逻辑。

还有其他想法吗?任何人?

sql-server sql-server-2008
  • 1 个回答
  • 823 Views
Martin Hope
JohnG
Asked: 2018-09-04 09:50:36 +0800 CST

在 1.06 亿行表上创建索引

  • 2

我有一个在全球范围内安装的应用程序,它使用从 SQL Server 2008 Express 到 SQL Server 2017 企业版的 SQL 版本。

我尝试了几种方法来在一个大表上创建索引(3 列,包括 3 列),其中数据库通常处于简单恢复模式,但可以作为完全恢复模式......硬件可能与一个客户顶部有很大差异其他:

  1. 更改表创建索引...
  2. 使用新索引创建一个 tmp 表,并使用“插入”复制数据,然后是原始表的删除表和 tmp 表的重命名以替换原始表。
  3. 使用新索引创建一个 tmp 表,并使用 PowerShell 脚本复制数据,然后将原始表的删除表和 tmp 表重命名以替换原始表。

3 个选项中最快的是第一个选项(创建非聚集索引的传统方式),它花费了 1 小时 15 分钟,记录了超过 1.06 亿条记录(该表有 200 列......不理想,但这是我正在使用的)其他选项花费了三倍的时间甚至更多)

不幸的是,我无法使用在线功能,因为 SQL Server 版本有多种,并且在线仅适用于企业版。

在我的实验室里 1 小时 15 分钟太长了,我想尝试另一种方法来降低它,特别是在我们的下一个应用程序更新中,我们需要创建 23 个索引......而我没有没有看到需要 5-6 小时的更新,客户也不会希望等待 5-6 小时来更新软件。

此外,在更新期间,更新不需要数据库上的任何活动。

我正在寻找的只是我可以尝试在合理的时间内创建索引的想法。没有代码!只需要理论上的想法。

任何想法将不胜感激。

sql-server index
  • 1 个回答
  • 6621 Views
Martin Hope
JohnG
Asked: 2017-08-23 06:29:55 +0800 CST

使用 PK/聚集索引查询大表时的性能问题

  • 2

为简化情况,我将只考虑一张大桌子……
商店每晚会将一张大桌子的所有新数据和更改数据发送到总部。(这部分很好)此外,商店将过去 30 天该表的摘要发送到该大表的总部。

在总公司,新的和更改的数据在大表中更新(这里没问题)。收到并上传到表中的最后 30 个摘要。然后将它与一个查询进行比较,该查询汇总了同一商店的这个非常大的表(包含所有商店)的总部数据。< - 这就是问题所在。这样做是为了确保商店的数据与该商店的总部数据匹配(如果不匹配,我们会收到警告,他们需要采取行动)

问题是摘要查询花费了太多时间......我希望以更有效的方式改变我们将存储表与主机表进行比较的方式。

我尝试了索引视图,结果很好,但事实上它们有太多限制,由于结构不同,实际上不可能大规模实施(对所有软件所有者、收银机、商店和总部)以及我们软件的不同版本。

我一直在尝试不同的方法来确保商店的表格数据(至少过去 30 天)与总部相匹配,但我觉得我在转圈......所以我'正在寻找想法来帮助我以不同的方式看待这个问题。

限制:我们在商店使用 SQL Express,通常在总部使用标准。两个数据库之间没有直接连接(数据通过文件传输)。

任何帮助表示赞赏。谢谢你


添加了更多信息: 表的结构(我知道不理想,这是我继承的): 日期、商店、终端、transNum、lineNum、数量、金额 + 194 更多列。 PK 和聚集索引为:Date, Store, terminal, transNum, lineNum

要总结的查询很简单:

Select Date, Store, sum(Qty) as Qty, sum(Amount) as Amt
from MyHugeTable 
where date between '2017-07-22' and '2017-08-22'
and store = '1234'
group by Date, Store;
sql-server t-sql
  • 2 个回答
  • 1805 Views
Martin Hope
JohnG
Asked: 2017-05-10 06:24:16 +0800 CST

tsql 进程永远运行......它在做什么

  • 3

为了创建一个大的测试数据库,我创建了一个 SP,它使用预定义的表列表(我感兴趣的 35 个)并将每个表中的数据相乘。

换句话说,一张表有一个商店的数据。我在这个表中插入了相同的数据,但使用了不同的商店编号(这给了我 2 个商店)。然后,我调用同一个 SP,将 2 个存储数据乘以 4 个存储,依此类推。周末我开始了 SP 的 6 个后续调用的过程,认为当我星期一回来时我的数据库将有 64 个商店的数据。不幸的是,事实并非如此……

周一来的时候,发现数据HD已经满了,但是进程没有崩溃,好像挂了。我的数据库处于简单恢复模式,我通过移动文件和缩小 TempDB(通过 SSMS 中的缩小文件选项)来腾出空间,并在外部驱动器上创建了一个初始大小为 100GB 的额外 ndf 文件......该过程仍在运行(腾出空间后超过 24 小时)。

spid 的任务状态显示暂停,等待类型为 PAGEIOLATCH_EX,但等待时间很短(低于 100 毫秒),这让我相信该进程仍在运行。

35 个表中有 34 个表大小合适并且乘法速度足够快...该过程已将所有表中的 1 个数据存储乘以 8 个存储,并且仍在完成从 8 个存储到 16 个存储的数据乘法...它似乎正在处理的一张桌子是所有桌子中最大的...

将该表的数据从 8 个存储增加到 16 个的实际过程是从 4 亿条记录中插入 4 亿条记录,该表有 200 列所有不同类型。

我在浪费时间等待吗?恐怕杀死进程需要几天时间才能回滚......我应该等待它吗?它变成了幻影进程吗?我怎么知道它在做什么?

任何意见/想法将不胜感激。

谢谢

sql-server t-sql
  • 2 个回答
  • 971 Views
Martin Hope
JohnG
Asked: 2017-03-04 12:17:09 +0800 CST

Web 环境体系结构中的 SQL Server Web 服务

  • 1

我是 SQL Server Web 服务的新手,在设置安全的 Web 环境方面不太了解......从我读到现在关于 SQL Web 服务的内容来看,我需要:1. 创建一个存储过程,2. 创建端点 3. 创建 Web 服务 4. 从 Web 调用存储过程...

听起来很简单,尽管对于第 3 步和第 4 步,我暂时不知道该怎么做……但我的问题是在我开始测试之前的体系结构中。据我了解,SQL Web 服务驻留在 SQL Server 上?如果是这种情况,是否意味着 DMZ 可以直接访问我们的内部网络?据我所知,这是一个诺诺......

在一个架构中,我希望在一个封闭的网络中有一个 SQL Server,在一个 DMZ 中有一个应用程序/业务层,在另一个 DMZ 中有一个 Web 服务器......我如何才能从 SQL Server 中获得一些需要的信息在封闭的网络中同时保持安全?因此我开始调查使用 SQL Server Web 服务的可能性的原因......

在我看来,DMZ1 中的每个 Web 服务器都将在 DMZ 中拥有它们的数据库,其中将包含运行网站所需的最少非敏感信息,但检索可以生成的一般累积信息(例如积分、销售或历史信息等)来自不同网站和不同来源的数据由于其大小而无法传输到网站数据库,并且需要实时数据。我正在考虑拥有一个包含 SQL Server Web 服务(作为 SQL Web 服务层)的 DMZ2,它将从我们网络中的 SQL 服务器检索数据。
可能吗?这是个好主意吗?如果没有,你会怎么做?

谢谢您的帮助。

sql-server-2012 sql-server-2014
  • 1 个回答
  • 300 Views
Martin Hope
JohnG
Asked: 2016-04-14 09:26:14 +0800 CST

使用 DBCC CheckDb 主动产生错误

  • 5

有谁知道如何让 DBCC CheckDB 产生错误?我正在测试一个脚本,需要以最简单的模式使用 DBCC Checkdb 来返回错误,同时尝试修复和尝试进入单用户模式时...

我正在使用的简单 dbcc checkdb 命令是批处理文件的一部分,如下所示:

OSQL -S MYPC -E -d MyDB -l 10 -Q "DBCC CHECKDB(AG_DB_STORESQL)" -b -o c:\MyFolder\MSSQL_DB_CHECK.Log

如果没有发现错误,脚本结束。如果发现错误,脚本会尝试使用 REPAIR_REBUILD 选项修复它们,如果失败,脚本会尝试使用 REPAIR_ALLOW_DATA_LOSS 选项修复它们。显然,在尝试修复脚本之前尝试将数据库置于单用户模式(这也是错误陷阱)

所以我正在寻找的是一种导致 DBCC CheckDB 返回错误的方法。

dbcc-checkdb
  • 3 个回答
  • 1003 Views
Martin Hope
JohnG
Asked: 2016-03-30 10:03:30 +0800 CST

a=0 and b=0 and ... z=0 vs a+b+c+d=0 的表现

  • 20

这是一个简单的问题,我似乎找不到答案。

在性能方面,如果我有一个WHERE子句a=0 and b=0 and ... z=0,如果我用 替换那个条件,我会获得任何性能a+b+...+z=0吗?

换句话说,通过替换以下内容是否有任何性能提升

Select * 
From MyTable 
Where A=0 and B=0 and C=0 and D=0...

和

Select * 
From MyTable 
Where A+B+C+D=0...

我知道它可以依赖于索引,但为了这个目的,我们只说不存在索引。算术运算符 (+) 的性能是否优于“OR”或“AND”逻辑运算符?

我的印象是,加法比使用 AND 或 OR 的多个条件执行得更好。

试验结果

在 420 万行的表上

返回行其中 A=0 B=0 和 C=0 -> 351748 行

加法 (A+B+C=0) 耗时 5 秒,而逻辑条件 A=0 和 B=0 和 C=0 耗时 11 秒。

另一方面

返回行其中 A<>0 B<>0 或 C<>0 -> 3829750 行 58 秒

返回行 其中 F65+ F67+f64<>0 -> 3829750 行 57 秒

对于 OR,似乎没有显着差异。

我同意 gbn:

如果 A 为 -1 且 B 为 1,则 A+B=0 但 A=0 且 B= 0 为假

并使用 AMtwo:

ABS(A)+ABS(B)+ABS(C)+ABS(D)... 即使您只期望正值,如果该列接受负值,您应该假设您可能会遇到一个

结果非常令人印象深刻,正如我所想,加法似乎比逻辑运算符快得多。

A = 浮动,B = 货币和 C = 浮动。使用的查询如图所示。就我而言,都是正数。没有索引。在我看来,加法比逻辑条件更快是合乎逻辑的!

sql-server performance
  • 5 个回答
  • 5255 Views
Martin Hope
JohnG
Asked: 2016-02-13 11:54:18 +0800 CST

TSQL 删除所有日期和存储数据

  • 0

这听起来像是一个愚蠢的问题,但我似乎找不到更好的方法。这是一个发布系统,商店每天向我们发送信息(可以持续多天)。该信息放在 TempTable 中。对于在 TempTable 中找到的每一天,它总是一整天,并且 TempTable 适用于其中找到的所有商店。因此,如果 TempTable 有 2 个不同的 Stores 和 2 个不同的 Days,例如 Day1-Store1 和 Day2-Store2,这意味着 Store2 的 Day1 和 Store1 的 Day2 没有发生任何事情。

所以,我想删除 BigTable 具有的任何记录(对于特定的一天和商店)不在 tempTable 中(对于在 TempTable 中找到的天数和找到的商店)换句话说,如果 Temptable 有 Day1-Store1 的条目和 Day2-Store2,我需要从大表中删除 Day1-Store2 和 Day2-Store1 以及任何其他不在临时表中的条目...

这就是我现在正在使用的(它有效)但是它花费的时间太长了。我正在寻找一种方法来最大程度地减少 TempTable 上的连接数。BigTable 和 TempTable 上都存在匹配的聚簇索引 (Date/Store/SKU_id)

Delete X 
From BigTable X 
join (Select Distinct postingDate from TempTable) D on X.PostingDate = D.PostingDate
Join (Select Distinct postingStore from TempTable) S on X.Store = S.PostingStore
Left join TempTable T on X.PostingDate = T.PostingDate 
    and X.Store = T.PostingStore and X.SKU_id = T.SKU_id
Where T.Sku_id is null

我敢肯定这不是最好的方法。提前谢谢大家

[更多信息] 因为我注意到发布的建议是删除 BigTable 中不在 TempTable 中的所有内容,所以我认为我应该添加以下几点:

BigTable 包含所有已发布商店的所有日期。TempTable 包含在 TempTable 中找到的特定日期和商店的发布信息。我想从 BigTable 中删除在 TempTable 中找到的 Stores 和 Days,但不删除 BigTable 中已有的良好条目。

如果 Big Table 有以下条目:

Day1 Store1 Sku123 ... 
Day1 Store2 Sku124 ...
Day1 Store3 Sku123 ...
Day2 Store1 Sku124 ... 
Day2 Store2 Sku123 ... 
Day2 Store3 Sku123 ... 

并且 TmpTable 具有以下条目:

Day1 Store1 Sku124 ...
Day2 Store2 Sku123 ... 

我想从 BigTable 中删除不在 TempTable 中的 Store1 和 Store2 的第 1 天和第 2 天的任何记录...所以我想从 BigTable 中删除以下记录:

Day1 Store1 Sku123 ... 
Day1 Store2 Sku124 ...
Day2 Store1 Sku124 ... 
sql-server t-sql
  • 2 个回答
  • 74 Views
Martin Hope
JohnG
Asked: 2015-11-11 12:36:10 +0800 CST

在 SQL Server 中,是否还有其他数据导入和导出选项

  • 2

我从 SQL Server 7 开始就一直在使用 SQL Server。所以我了解 BCP、批量插入、openrowset 和 SSIS。

我的问题很简单:

  • 您是否知道使用 SQL server Express 版本 SQL 2005 至 2014(以及即将推出的 2016)导入/导出数据的任何其他方法。

我想确保没有任何其他问题,因为使用 BCP(这是我现在正在使用的)需要使用xp_cmdshell并且出于安全原因,需要一个xp_cmdshell_proxy帐户。我在工作中受到挑战,想确保在我回应之前不存在任何其他问题,或者这是 Microsoft SQL Server (Express) 中的新问题。

sql-server import
  • 1 个回答
  • 662 Views
Martin Hope
JohnG
Asked: 2015-11-06 13:25:25 +0800 CST

Service Broker 是审计 SQL Server Express 上数据更改的最佳选择吗?

  • 5

我的项目是在不延长事务的情况下审计我们系统中的 5 到 10 个现有表。无论使用哪种方法,它都必须在 SQL Server Express 2005 到(最终)2016 上运行。

我对变更数据捕获 (CDC) 和变更跟踪进行了研究。更改跟踪不捕获特定更改,CDC 仅在企业版中可用。

然后我偶然发现了 Service Broker。我对 Service Broker 很感兴趣,所以我开始创建一个原型。Service Broker 工作正常,但在我的其他两个帖子中收到的答案让我相信这可能不是正确的方法。太复杂了无所谓。我仍处于分析阶段并尝试不同的事情作为我分析的一部分。

目前,服务代理的结果并不令人信服……将 105000 件商品批量更新到价格表需要 38 秒,而处理队列(审计部分)需要 17 秒……但 38 秒包括插入 2 个 #temp 表的双重处理,然后用于插入 TMPins 和 TMPdel。所以我想我可以把它减半......我现在质疑服务代理的使用......从逻辑上讲,只需将信息直接插入审计表,触发器可能会花费相同的时间...... .

澄清一下,当我说批量插入时,它不是“批量插入”功能。我说的是一次插入或更新的大量数据。在更新价格表中的 105000 项时,我想审核发生的更改。当我说发生了变化时,我决定在审计表中插入新值(如果它是插入或更新)或插入所有其他字段为空的主键(对于已删除的记录)......所以是的!它可以在数据加载之后,但我不想失去任何审计(我不希望交易乱序传递)

另外两篇文章将有助于了解我正在尝试做的事情和我尝试过的事情:

  • 触发器创建要发送到服务代理的变量表
  • 触发器 - 在动态 SQL 中使用插入/删除的表

我重视每一个想法。

sql-server trigger
  • 1 个回答
  • 4252 Views
Martin Hope
JohnG
Asked: 2015-11-05 14:11:43 +0800 CST

触发器 - 在动态 SQL 中使用插入/删除的表

  • 7

在触发器中,我试图创建一个唯一的表名(使用NEWID()),我可以存储在插入和删除的表中找到的数据。

Declare @NewID varchar(50) = Replace(convert(Varchar(50),NEWID()),'-','')
Declare @SQLStr varchar(8000)
Set @SQLStr= 'Select * into [TMPIns' + @newID + '] from inserted'
Exec (@SQLStr)

我收到以下错误:无效的对象名称“已插入”

我知道我可以做到:

Select * into #inserted from inserted
Set @SQLStr= 'Select * into [TMPIns' + @newID + '] from #inserted'
Exec (@SQLStr)

但我不想使用 TempDB,因为这些表可能会变得很大,而且我也觉得它是多余的。有没有办法避免创建#inserted?

sql-server trigger
  • 2 个回答
  • 6185 Views
Martin Hope
JohnG
Asked: 2015-11-05 07:25:08 +0800 CST

触发器创建要发送到服务代理的变量表

  • 2

我第一次设置了服务代理并对其进行了测试……看起来不错。每次在特定表上发生 DML 操作时;假设价格表,一个触发器调用一个存储过程,将插入和删除的表作为 XML 参数传递给它,这会将消息(包含 2 个 XML)发送到队列。

激活过程然后处理队列,并将对初始表所做的更改插入到审计表中......效果很好。

当价格表上的更新量很大时,就会出现问题。就我而言,我测试了 105 000 件商品的价格变化更新。XML Inserted 和 Deleted 变量,每个包含 130 万行......这会导致主要问题:TempDB 无限增长,处理器上升到 95%,这是可以理解的......但似乎从未完成操作。

触发器的代码是Price_TAB_Audit_trig。触发器调用SendMsgServiceBroker过程将消息发送到队列。有关激活过程,请参阅下面的评论。

我试图弄清楚如何将插入和删除的变量(消息)分解成更小的 XML。我的问题/想法是:我可以创建表变量并将其传递到消息而不是 XML 中吗?如果是这样,如何在触发器中创建变量表?我应该创建全局唯一临时表并在消息中引用它们吗?

任何其他建议,欢迎。提前谢谢你

sql-server trigger
  • 2 个回答
  • 2524 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