小编Pau*_*ite的帖子

如果表存在而不使用 sp_executesql 更新表中的行

我有一种情况,我需要对大量类似的数据库运行查询。他们中的大多数人都会有一个表,我需要更新其中的一些行,但其中一些人没有该表。

我想编写一个查询,该查询具有IF检查表是否存在EXEC sp_executesqlUPDATE语句,而无需使用该语句。有没有办法在 SQL Server 中做到这一点?

这是我今天正在做的一个例子:

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[MyTableName]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN
  -- this is what I want to be able to do but cannot
  UPDATE [dbo].[MyTableName] SET [SomeColumn] = NULL WHERE [SomeColumn] NOT IN (1, 2, 3)

  -- this is the only way I know to do this without an error
  EXEC sp_executesql N'UPDATE [dbo].[MyTableName] SET [SomeColumn] = NULL WHERE [SomeColumn] NOT …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2017

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

SQL Server 不使用 OPTION(MAXDOP 20)创建并行计划

我们在具有 8 个套接字和 20 个处理器的 VM 上托管了一个 UAT3 服务器,我们在具有相同配置的同一 VM 上托管了类似的 UAT2 服务器。

我们在两个服务器上运行以下查询

select recid from Table1 where nation='AE'
Run Code Online (Sandbox Code Playgroud)

两个服务器具有相同的数据和相同的结构。

UAT2 和 UAT3 具有默认设置并行5 和最大并行度的成本阈值0。

IN UAT2 服务器并行处理正在发生。它需要 10 秒才能完成,但 UAT3 串行处理正在发生,因为它需要 3 分 30 秒。

我们比较 UAT2 和 UAT3 服务器配置都相同。不知道为什么 SQL Server 在 UAT2 中选择并行执行而不是在 UAT3 中。

下面是表定义

select recid from Table1 where nation='AE'
Run Code Online (Sandbox Code Playgroud)

下面是视图

CREATE TABLE [dbo].[FKMB_CUSTOMER]( 
    [RECID] [nvarchar](64) NOT NULL, 
    [XMLRECORD] [xml] NULL, 
    [ALT_CUSTOMER] AS 
        ([dbo].[IX_CUSTOMER_ALT_CUSTOMER]([XMLRECORD])) 
        PERSISTED, 
    [SMS] AS 
        ([dbo].[IX_CUSTOMER_SMS_1]([XMLRECORD])) …
Run Code Online (Sandbox Code Playgroud)

sql-server parallelism execution-plan query-performance

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

获得第三个星期五之后的第一个星期一

我在这个网站上看到了如何获得本月的第三个星期五:

select quote_date
FROM table
 where  datename(weekday, quote_date) = 'Friday'
and datepart(day, quote_date)>=15 and datepart(day, quote_date)<=21;
Run Code Online (Sandbox Code Playgroud)

在第三个星期五之后,我将如何获得第一个星期一?

sql-server date-math

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

按估计的操作员成本对执行计划 XML 进行排序

我想按Estimated Operator Cost对执行计划 XML 进行排序,但问题是:

\n

SQL Server 执行计划在 UI 中具有“估计操作员成本”条目:

\n

在此输入图像描述

\n

...但是 XML 输出中缺少该值。

\n

关于如何对 XML 进行排序有多种建议,例如:

\n\n

但两者都与我所拥有的相差甚远,因为“估计运营商成本”似乎是一个超级复杂的计算

\n

请问这个问题有什么解决办法吗?

\n

sql-server execution-plan

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

优化器如何执行标量函数

我在网上读到,标量函数会影响性能,因为优化器无法访问标量函数的内容。由于该函数是针对每一行执行的,因此优化器是否必须每次都为函数的内容构建执行计划,或者是否在第一次访问该函数时构建该计划,然后将其用于所有其他行?

sql-server optimization functions

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

SQL Server如何将大json上传到列中,性能问题

当 nvarchar(max) 列只有几 MB 数据时,我在表上的单行插入/更新语句上遇到性能不佳的情况。

这是我的表结构:

CREATE TABLE [dbo].[tbl_set_Cart](
    [ID] [int] NOT NULL,
    [AS400_CUSTOMER_COD] [nvarchar](50) NOT NULL,
    [AS400_LISTIN] [int] NOT NULL,
    [VALUE] [nvarchar](max) NOT NULL,
    [DELIVERY_COSTS] [nvarchar](max) NOT NULL,
    [ITEMS_COUNT] [int] NOT NULL,
    [ITEMS] [nvarchar](max) NOT NULL,
    [KIND] [int] NOT NULL,
    [CHECKOUT_INFO] [nvarchar](max) NOT NULL,
    [ISSUES] [nvarchar](max) NOT NULL,
    [LAST_CHECK] [datetime] NOT NULL,
    [USER_ID] [int] NOT NULL,
    [IMPERSONATED_USER_ID] [int] NOT NULL,
    [OVERRIDE_PRICES] [bit] NOT NULL,
    [HAS_ISSUE] [bit] NOT NULL,
    [IS_CONFIRMED] [bit] NOT NULL,
    [IS_COLLECTED] [bit] NOT NULL,
    [_METADATA] [nvarchar](max) NOT …
Run Code Online (Sandbox Code Playgroud)

sql-server update json performance-tuning

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

删除月份和日期的前导零

PostgreSQL 聊天室中的某人给了我这个语法。它用在VIEW输出 RSS feed 链接的 a 中:

to_char(tips_chronic_pain_weekly_selection.start_date, 'YYYY/MM/DD'::text)
Example output: 2021/09/13
Run Code Online (Sandbox Code Playgroud)

我不熟悉这是如何工作的。我可以删除月份和日期中的前导0吗?这是几个月前给我的,作为以下内容的缩短版本:

concat( extract( YEAR FROM tips_physical_disability_weekly_selection.start_date), '/',  extract( MONTH FROM tips_physical_disability_weekly_selection.start_date), '/',  extract( DAY FROM tips_physical_disability_weekly_selection.start_date) )
Run Code Online (Sandbox Code Playgroud)

postgresql date-format

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

暂时开启级联删除

以前可能有人问过这个问题,但我找不到答案。

我在 sql-server-20XX (更可能是旧的)中有一个复杂的数据模型,其中级联删除已被关闭(按设计)。

我们的数据库的很大一部分已经被出售(我可以在顶层进行区分),并且我们有理由想要删除这些数据。我想在一个脚本中执行此操作,其中我首先打开级联删除,然后删除所有数据,然后再次关闭级联删除,但我找不到正确的语法。

需要提及的相关事项:

  • 我想从总共 10-15 个表中删除大约 40% 的行,这些行都以某种方式 1:n-1:n...-耦合到组织表
  • 性能无关紧要,因为该应用程序不在工作时间之外使用

这些表必须保留,我需要删除组织表中的 10/33 行,并且需要删除与这些组织耦合的订单、用户...等中的所有行

sql-server

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

exec 限制为 4000 个字符?

尝试执行此脚本仅给出第一个选择结果

declare @sp nvarchar(max)
select @sp = concat(N'select 1 ', replicate('-', 5000), char(13) + char(10), N'select 2')
exec (@sp)
Run Code Online (Sandbox Code Playgroud)

但是当我将连字符降低到 1000 时,我还得到了第二个选择 如何克服这个限制?

sql-server dynamic-sql exec

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

从 nvarchar 列查找并显示特殊字符代码

我想知道我的 type 列中有哪些特殊字符(换行符、制表符等)nvarchar。我知道如何选择哪些行包含特定字符

例如SELECT * FROM your_table WHERE your_column LIKE '%' + CHAR(10) + '%'

但是,我想知道哪些列包含不在其中的字符[a-zA-Z0-9],然后知道哪些列包含其中的字符。我还查看了是否可以在列上进行选择以显示显示所有字符的原始文本(例如类似于 Microsoft Word 的显示所有字符),但我也找不到如何执行此操作。

sql-server string-manipulation sql-server-2019

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