标签: t-sql

SQL Server 中的公制到标准单位转换

我给出了两个表格的简化版本,如下所示。

表记录

ID  unit  val
--- ---   ---
1   KV    3
1   BAR   4
2   KV    7
2   KG    5
3   C     37
Run Code Online (Sandbox Code Playgroud)

表单位

unit    convUnit    formula
---     ---         ---
KV      CV          @val * .865
KG      lbs         @val / 2.205
BAR     PSI         @val / 14.504
C       F           @val * 9/5 + 32
Run Code Online (Sandbox Code Playgroud)

我将无法更改表结构。

我知道哪个单位将转换为哪个单位(即我知道 KV 将转换为 CV,KG 将转换为磅等..)。

请注意,公式是一varchar列,我从表格tblRecords.unit中引用了tblUnit.unit

但我的问题是如何在单个查询中动态计算公式。即我想要以下输出。

ID  unit    val     convVal(column will be counted on the fly using formula stored in tblUnit.formula …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server t-sql

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

使用通配符从 sys.views 中删除

我可以在我的服务器上运行删除语句,但是每当我where向删除语句添加子句时,它都会引发以下错误:

消息 10054,级别 20,状态 0,第 0 行
向服务器发送请求时发生传输级错误。(提供程序:TCP 提供程序,错误:0 - 现有连接被远程主机强制关闭。)

此语法引发错误 ->

DELETE 
FROM sys.views
WHERE sys.views.name LIKE '%DoNotNeed_%'
Run Code Online (Sandbox Code Playgroud)

为了删除所有以“不需要”开头的视图,我是否设置不正确?

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

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

光标永不停止

我似乎在这个光标中犯了一个错误,我似乎无法弄清楚我做错了什么。

我已经确认select拉回了 2 行。但是当我将它传递到游标中选择出现字符串时,我可以提取我需要的确切值。这两行看起来像下面这样......

|DATAIDONTWANT|...|DATAIDONTWANT|<|1|DATAIDONTWANT|<|2|DATAIDONTWANT|...|
|DATAIDONTWANT|...|DATAIDONTWANT|<|1|DATAIDONTWANT|<|2|DATAIDONTWANT|...|
Run Code Online (Sandbox Code Playgroud)

光标似乎抓住了第一行并不断循环,永远不会进入下一行或结束程序。

declare
    @clobstringP varchar(max),
    @clobstring  varchar(max);

declare SevenCursor cursor for 
    select [value] as ClobP
    from string_split(@clobstring, '>')
    where value like '%<|2|%';

open SevenCursor;
fetch next from SevenCursor into @clobstringP;

while @@FETCH_STATUS = 0
begin
    insert into [database].dbo.tablestuff ( ValueP ) 
    select file387
    from ( 
        select 
             RowId387 = row_number() over( order by ( select 1 ) )
            ,file387  = [value]
        from string_split(@clobstringP, '|')
    ) a
    where a.RowId387 = 6;

end;

close SevenCursor;
deallocate …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql cursors

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

sql脚本中的foreach循环?

在 powershell 中,我用来foreach通过目标列表运行一个函数。

我想知道是否有任何类似于foreachsql 的东西,所以我可以通过我选择的多个数据库运行相同的查询并将结果保存到一个 csv 文件?

sql-server t-sql csv

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

Sargability 问题 - 变量的顺序

我有一个有几行的存储过程:

AND ( @StartDate IS NULL OR @StartDate <= r.ReferralDate )
AND ( @EndDate IS NULL OR @EndDate >= r.ReferralDate )
Run Code Online (Sandbox Code Playgroud)

是否应该改写为:

AND ( r.ReferralDate >= @StartDate or @Startdate IS NULL  )
AND ( r.ReferralDate <= @EndDate or @EndDate IS NULL )
Run Code Online (Sandbox Code Playgroud)

我尝试了两种方法并查看执行计划。估计的行数略有不同,但除此之外我没有看到任何变化,所以我认为语句中的顺序无关紧要,但希望有人可以验证。

performance sql-server t-sql query-performance

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

获取包含 INSERT 的存储过程的“列表”,而无需命名所涉及的列

作为某些增强功能的一部分,750 多个表中添加了一个新列。现在我的问题是在将近 3000 多个存储过程中,一些旧的 INSERT 没有命名列。

有什么办法可以得到所有没有列名插入的存储过程的“列表”?

我试过了:

SELECT OBJECT_NAME(object_id)
FROM sys.sql_modules
WHERE definition LIKE '%insert into%' 
AND definition NOT LIKE '%) value%'
AND definition NOT LIKE '%)%' + CHAR(10) + '%value%'
AND definition NOT LIKE '%)%' + CHAR(13) + '%value%'
AND definition LIKE '%value%' 
Run Code Online (Sandbox Code Playgroud)

但它仍然错过了很多。

PS - 上面的查询也返回 Insert Into (ColumnNames) SELECT 场景,这是我不想要的。

sql-server stored-procedures t-sql sql-server-2016

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

SQL Server Express Edition 功能和升级问题

我想用 SQL Server 安装和学习 T-SQL。我能找到的最轻的版本是 Express Edition 2017。

  1. Express版是否支持程序、触发器、动态sql、PIVOT、序列、动态管理视图和函数?

  2. 将来是否可以升级以添加 ssis、ssrs 和 ssas(我阅读了 Microsoft 社区博客上的文档,但找不到特定于此版本的答案),也许我将来会需要它们。

sql-server t-sql sql-server-express

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

在列存储索引扫描运算符之前消除过滤运算符

我有一个包含数百万行的大型事实表,称为 MyLargeFactTable,它是一个聚集列存储表。

那里也有一个复合主键约束(customer_id、location_id、order_date 列)。

我还有一个临时表#my_keys_to_filter_MyLargeFactTable,具有相同的 3 列,它包含这 3 个键值的几千个 UNIQUE 组合。

以下查询为我提供了所需的结果集

...
FROM #my_keys_to_filter_MyLargeFactTable AS t
JOIN dbo.MyLargeFactTable AS m
ON m.customer_id = t.customer_id
AND m.location_id = t.location_id
AND m.order_date = t.order_date
Run Code Online (Sandbox Code Playgroud)

但我注意到事实表上的索引扫描运算符返回的行数比它应有的多(大约一百万)并将其输入到过滤器运算符中,这进一步将结果集减少到所需的几千行。

在此处输入图片说明

索引扫描操作符读取多行(它们相当宽的行)增加了 IO,并显着减慢了整个查询。

我的参数不是 sargable 吗?

如何删除 Filter 运算符并以某种方式强制 Index Scan 运算符仅读取几千行?

表定义:

create table #my_keys_to_filter_MyLargeFactTable 
(
customer_id varchar(96) not null,
location_id varchar(96) not null,
order_date date not null,
primary key clustered (customer_id,location_id,order_date)
)

create table MyLargeFactTable
(
customer_id varchar(96) not null,
location_id varchar(96) not null,
order_date …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql index-tuning columnstore sql-server-2017

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

将查询结果放入变量和 WITH 语句中

我需要将查询结果放入一个变量中。

只是一个查询,工作成功

DECLARE @count INT = (

SELECT count (*)
FROM [AdventureWorks].[Person].[Address]    
);

select @count;
Run Code Online (Sandbox Code Playgroud)

但是如果我需要WITH在查询中使用该语句,则会出现语法错误

DECLARE @count INT = (
   WITH person_address (id)
   as (
    SELECT AddressID
    FROM [AdventureWorks].[Person].[Address]
   )
   SELECT count (*)
   FROM person_address    
);

select @count;
Run Code Online (Sandbox Code Playgroud)

消息 156,级别 15,状态 1,第 2 行 关键字“WITH”附近的语法不正确。

消息 319,级别 15,状态 1,第 2 行 关键字“with”附近的语法不正确。如果此语句是公用表表达式、xmlnamespaces 子句或更改跟踪上下文子句,则前一条语句必须以分号终止。

消息 102,级别 15,状态 1,第 9 行 ')' 附近的语法不正确。

如果WITH在 SQL 语句中使用了子句,如何将查询值放入变量中?

sql-server t-sql

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

如果表存在而不使用 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
查看次数