标签: t-sql

跨多行应用引号

在 SQL Server Management Studio 中,您可以使用快捷方式CTRL + K > CCTRL + K > U批量注释/取消注释行。

是否有类似的键盘功能可以在值列表中应用单引号?我有 150 个从 Excel 电子表格复制的 ID,我想在此列表上执行使用 IN 子句的查询,我不想在每个项目周围手动添加单引号和逗号。

例如:

SELECT * FROM tbl WHERE someValue IN (
ABC1
ABC2
ABC3
ABC4
)
Run Code Online (Sandbox Code Playgroud)

我想突出显示这些值并使用键盘快捷键将列表变成:

SELECT * FROM tbl WHERE someValue IN (
'ABC1',
'ABC2',
'ABC3',
'ABC4'
)
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2008-r2

4
推荐指数
2
解决办法
2万
查看次数

SQL“标准”指南?

我目前正在学习 TSQL 并且正在学习这是可能的,我应该使用“标准”SQL 方言。我在哪里可以找到哪些命令是“标准”的,哪些是 TSQL?

sql-server t-sql sql-standard

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

SQL Server:使用 XPath 性能解析

我有一个用户界面,允许用户选择他们想要过滤结果的某些数据点。有位置、部门等内容。一旦他们选择了所有选项,我就会生成一个 XML 字符串,并将其传递给我的存储过程。

从那里,例如,对于位置,我创建了一个临时表并将用户选择的所有位置转储到该表中,然后我稍后加入我的数据。

在运行执行计划时,我注意到解析过滤器数据的 5 个左右的查询中的每一个都花费了大约 12%,这超过了查询的 60%,只是为了确定我们将要过滤的数据。

DECLARE @tmLocations TABLE (
    location VARCHAR (100));
BEGIN
    INSERT INTO @tmLocations
    SELECT ParamValues.x1.value('location[1]', 'VARCHAR(200)')
    FROM   @xml.nodes('data/teammateLocations/locations') AS ParamValues(x1);
END
Run Code Online (Sandbox Code Playgroud)

是否有另一种从 XML 中提取数据的方法或改进上述查询的方法,以便运行成本不高?设置数据比实际过滤数据的成本更高,这确实会降低性能。

sql-server-2008 sql-server stored-procedures t-sql execution-plan

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

当另一半失败时,交易的一半完成?

我在 SO、MSDN 和其他各种来源上进行了一些搜索,发现了很多关于事务的问题,但似乎没有一个正是我正在处理的问题。

诚然,尽管我确实了解 ACID 和事务的概念,但我仍然是初级 DBA。我正在处理一个 SQL 脚本:

  1. 向 2 个不同的表添加一行,前提是这些值尚不存在
  2. 如果存在,则删除列
  3. 如果不存在则添加一列
  4. 更改 2 个生成动态 SQL 以构建报表查询的存储过程

上述所有操作都是独立工作的,并且在(我认为是)单个事务中包含时,它们也会协同工作。我试图理解的是,当事务的另一部分失败时,事务的“部分”如何完成(并可能提交)。

为简洁起见,假设我有名为“ProcessReport”和“RetrieveReport”的工作程序。这两个过程中的动态 SQL 都以“SELECT”开头,然后从那里开始构建。测试用例:

CREATE TABLE ReportTable (FirstName VARCHAR(100), LastName VARCHAR(100), OrderId INT);
GO
CREATE PROCEDURE ProcessReport
AS
BEGIN
  DECLARE @SQL VARCHAR(4000)

  -- start creating dynamic sql   
  SET @SQL = 'SELECT FirstName, LastName, '
  --create rest of dynamic SQL here...

  INSERT INTO ReportTable (FirstName, LastName) EXEC(@SQL)
END
GO 

CREATE PROCEDURE RetrieveReport
AS
BEGIN
  DECLARE @SQL VARCHAR(4000)

  -- start creating dynamic sql …
Run Code Online (Sandbox Code Playgroud)

t-sql transaction sql-server-2012 acid

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

NTILE 是否适用于浮点数?

我试图在我的 PARTITION BY 子句中使用浮点数据类型对我的数据使用 NTILE。请原谅人为的例子,但我认为说明我的问题和困惑的最好方法是通过以下代码:

CREATE TABLE Test 
(
    Cash float NOT NULL,
    Number int NOT NULL
)
GO

INSERT INTO TEST VALUES(1.05,1);
INSERT INTO TEST VALUES(1.368,1);
INSERT INTO TEST VALUES(0.775,1);
INSERT INTO TEST VALUES(1.699,1);
INSERT INTO TEST VALUES(1.599,1);
INSERT INTO TEST VALUES(0.80,1);
INSERT INTO TEST VALUES(0.80,1);
INSERT INTO TEST VALUES(0.994,1);
INSERT INTO TEST VALUES(0.848,1);
INSERT INTO TEST VALUES(0.675,1);
INSERT INTO TEST VALUES(0.575,1);
INSERT INTO TEST VALUES(12.998,1);
INSERT INTO TEST VALUES(1.999,1);
INSERT INTO TEST VALUES(0.65,1);
INSERT INTO TEST VALUES(0.80,1);
INSERT …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

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

如何在 sp 中使用 tsql 语句设置“结果为文本”?

有什么方法可以在执行过程时在 SP 内设置“结果为文本”?tsql 语句?

谢谢。

sql-server-2008 t-sql

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

如何对数据进行分组并为每一行写入其组 ID?

我有样本数据:

CREATE TABLE #T (Name varchar(5), GroupId int NULL)
INSERT INTO #T (Name)  VALUES 
('A'),
('A'),
('A'),
('B'),
('B'),
('C'),
('D'),
('D') 

Name  GroupId
----- -----------
A     NULL
A     NULL
A     NULL
B     NULL
B     NULL
C     NULL
D     NULL
D     NULL
Run Code Online (Sandbox Code Playgroud)

如何按名称对数据进行分组,并在其后写入 groupId(顺序,可能是身份)?这就是我想要得到的:

Name  GroupId
----- -----------
A     1
A     1
A     1
B     2
B     2
C     3
D     4
D     4
Run Code Online (Sandbox Code Playgroud)

要分组的表有大约 15m 行。如何更好地做到这一点?谢谢!

t-sql sql-server-2012 rank

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

查找未找到日期完全匹配的最新行

我正在尝试编写一个查询,尝试提取汇率的值,其中:

  • 查询日期=兑换日期;和
  • 查询币种=指定币种

如果它不包含像 2015 年 9 月 5 日那样的匹配值,它应该从包含值的最后一个日期中提取值。在这种情况下,该值应取自 4-Sep-2015:

 Create Table ExchRate
 (  Exch_ID int,
    Currency varchar(3),
    Exch_value numeric(14,7),
    Exch_date datetime)

Insert INTO ExchRate 
Values (1, 'SGD', 1.4173000, '2015-09-04 00:00:00'),
       (2, 'SGD', 1.4240000, '2015-09-07 00:00:00'),
       (3, 'SGD', 1.4291500, '2015-09-08 00:00:00'),
       (4, 'EUR', 0.8984700, '2015-09-04 00:00:00'),
       (5, 'EUR', 0.8955700, '2015-09-07 00:00:00'),
       (6, 'EUR', 0.8957000, '2015-09-08 00:00:00')
Run Code Online (Sandbox Code Playgroud)

结果应该是:

Currency   Exch_Date   Exch_Value
SGD        2015-09-05  1.4173000
Run Code Online (Sandbox Code Playgroud)

其次,如果我从另一个表加入以计算美元的总成本怎么办?我应该使用什么样的 SQL 语句?在这个SQLFiddle 示例中,它应该为每个具有不同 PO 日期的 PO 提供汇率值。

sql-server t-sql

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

SSMS 输出中的格式列长度

SQL Server 2012。本文底部的示例查询。

我正在尝试为上次备份给定数据库的时间创建一个简单的报告。

在 SSMS 中执行输出到文本的示例查询时,DB_NAME列被格式化为数据的最大可能大小(DB2 中存在相同的问题,顺便说一句)。所以,我有一列包含从不超过 12 个字符的数据,但它存储在 中varchar(128),无论如何我都会得到 128 个字符的数据。RTRIM对输出没有影响。

您知道有没有一种优雅的方法可以使格式化的列长度成为实际数据的最大大小,而不是数据的最大潜在大小?

我想存在一个xp_sprintf()函数,但我不熟悉它,而且它看起来不是很健壮。

我试过像这样铸造它:

DECLARE @Servername_Length int;
SELECT  @Servername_Length =        LEN(    CAST(   SERVERPROPERTY('Servername') AS VARCHAR(MAX)    )   ) ;

...
SELECT  
   CONVERT(CHAR(@Servername_Length), SERVERPROPERTY('Servername')) AS Server, 
...
Run Code Online (Sandbox Code Playgroud)

但是 SQL Server 不会让我在转换时@database_name_Length在我的varchar定义中使用该变量。显然,SQL Server 在声明charorvarchar变量时需要一个文字数字。

我开始在字符串中构建语句并使用类似的东西sp_executesql,或者构建一个具有我需要的实际列长度的临时表,这两者都比我希望去的只是为了不获得 100 更麻烦我的输出中有 128 个字符的列中的空格。

搜索了互联网并找到了bupkus。

也许我在寻找错误的东西,或者谷歌对我不利。

似乎 SSMS 会将列格式化为允许的最大大小,即使实际数据要小得多。我希望有一种优雅的方式来“解决”这个问题,而无需跳过箍。我正在使用 SSMS 2012。

如果我转到结果到网格,然后转到 Excel 或类似的东西,则会消除尾随空格。不过,我希望基本上创建一份我通过电子邮件发送的报告。 …

sql-server ssms t-sql sql-server-2012 reporting

4
推荐指数
2
解决办法
2万
查看次数

为 1 个查询忽略内存中的页面的方法

对于单个查询或批处理,是否有某种方法可以忽略缓存的查询计划和内存中的任何数据页?像表格提示或其他选项之类的东西可以仅为当前连接打开?

我想强制这个查询命中磁盘,因为我正在尝试调整它并且执行时间到处都是。试图减少游戏中的变量。

sql-server t-sql sql-server-2008-r2

4
推荐指数
2
解决办法
676
查看次数