我有一种情况,我需要对大量类似的数据库运行查询。他们中的大多数人都会有一个表,我需要更新其中的一些行,但其中一些人没有该表。
我想编写一个查询,该查询具有IF检查表是否存在EXEC sp_executesql的UPDATE语句,而无需使用该语句。有没有办法在 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) 我们在具有 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) 我在这个网站上看到了如何获得本月的第三个星期五:
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)
在第三个星期五之后,我将如何获得第一个星期一?
我想按Estimated Operator Cost对执行计划 XML 进行排序,但问题是:
\nSQL Server 执行计划在 UI 中具有“估计操作员成本”条目:
\n\n...但是 XML 输出中缺少该值。
\n关于如何对 XML 进行排序有多种建议,例如:
\n但两者都与我所拥有的相差甚远,因为“估计运营商成本”似乎是一个超级复杂的计算。
\n请问这个问题有什么解决办法吗?
\n我在网上读到,标量函数会影响性能,因为优化器无法访问标量函数的内容。由于该函数是针对每一行执行的,因此优化器是否必须每次都为函数的内容构建执行计划,或者是否在第一次访问该函数时构建该计划,然后将其用于所有其他行?
当 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) 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) 以前可能有人问过这个问题,但我找不到答案。
我在 sql-server-20XX (更可能是旧的)中有一个复杂的数据模型,其中级联删除已被关闭(按设计)。
我们的数据库的很大一部分已经被出售(我可以在顶层进行区分),并且我们有理由想要删除这些数据。我想在一个脚本中执行此操作,其中我首先打开级联删除,然后删除所有数据,然后再次关闭级联删除,但我找不到正确的语法。
需要提及的相关事项:
这些表必须保留,我需要删除组织表中的 10/33 行,并且需要删除与这些组织耦合的订单、用户...等中的所有行
尝试执行此脚本仅给出第一个选择结果
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 时,我还得到了第二个选择 如何克服这个限制?
我想知道我的 type 列中有哪些特殊字符(换行符、制表符等)nvarchar。我知道如何选择哪些行包含特定字符。
例如SELECT * FROM your_table WHERE your_column LIKE '%' + CHAR(10) + '%'
但是,我想知道哪些列包含不在其中的字符[a-zA-Z0-9],然后知道哪些列包含其中的字符。我还查看了是否可以在列上进行选择以显示显示所有字符的原始文本(例如类似于 Microsoft Word 的显示所有字符),但我也找不到如何执行此操作。
sql-server ×9
date-format ×1
date-math ×1
dynamic-sql ×1
exec ×1
functions ×1
json ×1
optimization ×1
parallelism ×1
postgresql ×1
t-sql ×1
update ×1