标签: t-sql

获取长请求的全文

如何从以下请求中获取请求的全文:

SELECT t.[text]
FROM sys.dm_exec_requests AS r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS t
Run Code Online (Sandbox Code Playgroud)

在这里,对于足够长的请求,请求文本会中断。我使用 SSMS 17 和 18 版本。

sql-server t-sql

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

在内部联接中选择 2 列

下面是我的两个表:

在此处输入图片说明

我正在尝试编写一个连接这两个表的查询,并为结果映射表的给定源 ID返回Source_TitleDestination_Title

我曾尝试编写查询,但我只能解决难题的一部分而不是整个问题。

SELECT Title as SourceTitle 
FROM Result Map AS RM 
INNER JOIN Table_Result TR ON RM.SourceId = TR.Id
Run Code Online (Sandbox Code Playgroud)

上面的查询为我提供了源的标题,但没有提供目标标题。

sql-server t-sql

5
推荐指数
2
解决办法
1508
查看次数

基于头记录分组数据

我有一个电子表格,我要导入到原始数据库中,一个 SQL Server 2016 数据库。它有所谓的“密码箱格式”的记录,显然是银行使用的。它通常看起来像这样:

Batch1 详细信息
子记录Batch2 的批处理 标题行的
另一个子记录
摘要

我在这里设置了一个小提琴

需要注意的是:

  • 第 1 列表示该行的记录“类型”。它是唯一的“通用”列。
  • 每隔一列本质上会根据记录类型而变化。
  • 将子记录与父记录相关联的唯一原因是它们出现在父记录之后和下一个父记录之前。ID 在行之间不共享。
  • 批次后面有可变数量的子行(不可预测)。

有没有办法查询这个,以便我可以轻松地对例如一批和它的子+页脚记录进行分组?我必须做的一件事是指出页脚记录包含正确的聚合(取自子记录;包括批次的子记录数量,这是我需要验证的一部分)。

sql-server t-sql sql-server-2016

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

标量 UDF 内联是否损坏?

此 SQL 代码返回“a”而不是“asdfg”:

CREATE FUNCTION [dbo].[GetPayload2] (@ID int) RETURNS VARCHAR(300) AS
BEGIN
IF @ID = 1
RETURN 'asdfg'
RETURN ''
END
GO
SELECT dbo.GetPayload2(1)
Run Code Online (Sandbox Code Playgroud)

转载于 15.0.2000.5 和 15.0.2070.41。在 SQL Server 2017 中工作正常。解决方法是使用 WITH INLINE = OFF。

编辑:如果您同意这是一个错误,请在此处投票:https : //feedback.azure.com/forums/908035-sql-server/suggestions/39190126-sql-server-2019-scalar-functions-with-inline-are -b

编辑 2:用于 MS SQL Server 2019 的 CU2 正在解决这个问题:-)

t-sql sql-server-2019

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

尽管定义了 RETURN VARCHAR(10),但用户定义的函数仅返回第一个字符?

每个人,

我无法弄清楚以下用户定义函数中缺少什么:

CREATE OR ALTER FUNCTION ufn_GetSalaryLevel(@Salary money)
RETURNS VARCHAR(10)
AS
BEGIN 
    IF (@Salary < 30000) RETURN 'Low';
    ELSE IF (@Salary <= 50000) RETURN 'Average';
    ELSE RETURN 'High';
    RETURN '';
END;

SELECT dbo.ufn_GetSalaryLevel(100440)
Run Code Online (Sandbox Code Playgroud)

输出仅包括“低”/“平均”/“高”返回值的第一个字符:

-----------------------------------------------------------------------
H

(1 row affected)
Run Code Online (Sandbox Code Playgroud)

为什么 MS SQL Server Management Studio 不考虑 VARCHAR(10)?

提前致谢!

Ps 请在下面找到我的输出 - 我不明白为什么它不能按预期工作?

在此处输入图片说明

ps2:该函数只有一个参数,我好像没有找到另一个同名的函数……下面可以找到与该函数相关的代码:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date, ,>
-- Description: <Description, ,>
-- =============================================
CREATE FUNCTION …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql functions sql-server-2019

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

IGNORE_DUP_KEY = ON 的索引过滤掉非重复记录

下面是一个脚本,可用于重现我面临的问题。基本上问题是这样的:为什么(ID1 = 6,ID2 = 7)的记录没有填充到最终的#tt2表中?我可以手动插入它,所以它不会违反 UNIQUE 约束,但它不会作为 INSERT/SELECT 的一部分进行填充。

USE [tempdb]
GO 

IF OBJECT_ID('tempdb..#t1') IS NOT NULL DROP TABLE #t1
CREATE TABLE [#t1] ([ID] INT , [V] VARCHAR(10))

INSERT INTO #t1 (ID, V) 
VALUES
(1,'A'),
(2,'B'),
(3,'B'),
(4,'C'),
(5,'E'),
(6,'E')

IF OBJECT_ID('tempdb..#t2') IS NOT NULL DROP TABLE #t2
CREATE TABLE [#t2] ([ID] INT , [V] VARCHAR(10))

INSERT INTO #t2 (ID, V) 
VALUES
(1,'A'),
(2,'B'),
(3,'C'),
(4,'C'),
(5,'D'),
(6,'E'),
(7,'E')

IF OBJECT_ID('tempdb..#tt') IS NOT NULL DROP TABLE #tt

SELECT t1.ID AS …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql unique-constraint

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

为连接表授予大内存

当我从两个连接表中选择列时,会获得巨大的内存授予(529808)。如果我单独查询每个表列,它的组合内存授予仅为 8008。

为什么组合的列列表有如此大的内存授予?或者我可以采取哪些步骤来找出答案?

SELECT *内存授予量为 529808: 在此输入图像描述


仅查询第一个表中的列的内存授予量为 6152: 在此输入图像描述


仅查询另一个表中的列的内存授予量为 1856 在此输入图像描述

sql-server t-sql memory-grant

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

SQL Server 中选择查询的区分大小写排序规则

我们的 SQL Server 的排序规则设置为SQL_Latin1_General_CP1_CI_AS

我有一个要求,即我们在不同的情况下具有相同的值,但 SQL Server 会以相同的方式对待它们,因为我们的排序规则在服务器级别设置为不区分大小写。我的要求是,我需要根据一个特定查询的大小写敏感性将每个值视为不同的。我COLLATE SQL_Latin1_General_CP1_CS_ASWHERE子句中使用来强制区分大小写。我的问题是:此排序规则是否仅应用于此查询,还是最终会在列或表级别为使用此列的所有查询更改此设置?

Create Table #tmpTest 
(
id int primary key identity(1,1),
name varchar(100)
)

Insert Into  #tmpTest  values ('TestQuery'),('TESTQUERY'),('TEstquerY')

Select * from #tmpTest
 Where name = 'TestQuery'

Select * from #tmpTest
 Where name = 'TestQuery'
 Collate SQL_Latin1_General_CP1_CS_AS
Run Code Online (Sandbox Code Playgroud)

sql-server query collation t-sql sql-server-2012

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

sp_executesql 不使用参数

我遇到了一个奇怪的动态 sql 问题,我认为这是某种格式问题,在过去的几个小时里我一直在为此抓狂。我非常感谢我能得到的任何帮助。

对于一些背景信息,此存储过程的目的是清理我们的集中式 (hq) 数据库中的数据,该数据库应该拥有我们所有商店的所有记录的完整副本。如果重要的话,我们正在运行 Microsoft Dynamics RMS (2.0.2022) 和 SQL 2014 Standard(对于总部,商店使用 Express)。

最初我打算将 sql 语句放在参数中并使用 exec 命令,但是虽然我不经常使用它,但我认为 sp_executesql 看起来更干净,并且更容易将查询重用为模板并进行更改他们。现在我只有一些选择的脚本,但是一旦它们完成,我将创建一个额外的存储过程来插入、删除和更新记录。

执行 sql 语句有效,但出于某种原因,我无法让 sp_executesql 使用存储过程中的参数。无论我将参数更改为什么,包括在存储过程中使用静态值,它都只会输出参数名称。所以无论:

@LS = @LinkedServer
Run Code Online (Sandbox Code Playgroud)

或者

@LS = 'StaticLinkedServerName'
Run Code Online (Sandbox Code Playgroud)

它返回的错误信息是:

在 sys.servers 中找不到服务器“@LS”。验证是否指定了正确的服务器名称。如有必要,执行存储过程 sp_addlinkedserver 将服务器添加到 sys.servers。

无效的解决方案

CREATE PROCEDURE [dbo].[usp_bn_ShowStoreHQSync]  
(
      @StoreCode        NVARCHAR(10)
     ,@LinkedServer     NVARCHAR(50)    
     ,@StoreDB          NVARCHAR(40)
)
AS          
BEGIN   
    BEGIN TRANSACTION
        BEGIN TRY
            IF @StoreCode IS NULL
                RAISERROR('@StoreCode Cannot Be NULL',15,1)
            ELSE IF @StoreCode NOT IN (SELECT StoreCode FROM [HQDB].[dbo].[Store])
                RAISERROR('@StoreCode Not In DB',15,1) …
Run Code Online (Sandbox Code Playgroud)

sql-server dynamic-sql t-sql

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

有没有办法按字母数字列排序?

我有一个表单位

单位名称
单元1
2b单元
2c单元
单元2a
单元10
单元3a
3c单元
第11单元

我想排序相同

单位名称
单元1
单元2a
2b单元
2c单元
单元3a
3c单元
单元10
第11单元

我们如何在 t-sql 中实现这一点?

数据定义语言

create table units (unitname varchar(20))
insert into units values ('unit 1'),('unit 2b'),('unit 2c'),
('unit 2a'),('unit 10'),('unit 3a'),('unit 3c'),('unit 11')
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server-2012

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