标签: sql-server-2016

LAG功能和NULLS

如何告诉LAG函数获取最后一个"非空"值?

例如,请参阅下面的表格,我在列B和C上有一些NULL值.我想用最后一个非空值填充空值.我试图通过使用LAG函数来做到这一点,如下所示:

case when B is null then lag (B) over (order by idx) else B end as B,
Run Code Online (Sandbox Code Playgroud)

但是当我连续有两个或多个空值时,这并不常用(参见C列第3行的NULL值 - 我希望它是原始的0.50).

任何想法我怎么能实现这一目标?(它不必使用LAG功能,欢迎任何其他想法)

一些假设:

  • 行数是动态的;
  • 第一个值将始终为非null;
  • 一旦我有一个NULL,就是NULL一直到最后 - 所以我想用最新的值填充它.

谢谢

在此输入图像描述

sql t-sql sql-server sql-server-2016

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

SQL Server 2016无法将系统版本控制添加到关系表

SQL Server 2016系统版本控制很酷.我使用的是免费的开发者版本.谢谢MS!

我无法弄清楚它是否会给我许多关系的版本控制.我有一个具有角色集合的User对象,反之亦然.实体框架已经产生的UserRoles保存之间的关系表UserRoles.我可以使用这篇文章http://sqlhints.com/tag/modify-existing-table-as-system-versioned-temporal-table/打开UserRoles表的系统版本控制.

但是,我无法开启UserRoles.我收到一个错误

将SYSTEM_VERSIONING设置为ON失败,因为表具有带有级联DELETE或UPDATE的FOREIGN KEY.

这是否意味着我们无法知道许多关系的版本控制?

例如.

  • 在6/1 - User1有role1和role2,但是
  • 6月4日 - User1的角色更改为role1和role3

所以,如果我想知道6/1上用户的状态,我认为只有开启系统版本操作才有可能UserRoles,但这不起作用.

这是可行的还是不受SQL Server 2016支持?如果没有,还有其他方法可以实现吗?

sql-server-2016

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

部署后SQL不会连接

我最近在IIS(LocalDB)上部署了我的网站.但每当我尝试运行网站时,SQL都无法连接.我现在已经浏览了数百个帖子/文章,但我无法解决它.

错误

建立与SQL Server的连接时发生与网络相关或特定于实例的错误.服务器未找到或无法访问.验证实例名称是否正确,以及SQL Server是否配置为允许远程连接.(提供程序:SQL网络接口,错误:50 - 发生本地数据库运行时错误.无法创建自动实例.有关错误详细信息,请参阅Windows应用程序事件日志.)

Windows应用程序事件日志

Windows API调用SHGetKnownFolderPath返回错误代码:5.Windows系统错误消息是:访问被拒绝.在线报道:422.

第二个日志 -

无法获取本地应用程序数据路径.很可能没有加载用户配置文件.如果在IIS下执行LocalDB,请确保为当前用户启用了配置文件加载.

我的连接字符串(试过两个) -

<appSettings>
    <add key="ConnectionString" value="Data Source=(LocalDB)\MSSQLLocalDB;Initial Catalog=test;Integrated Security=True" />
    <!--<add key="ConnectionString" value="data source=(LocalDB)\MSSQLLocalDB;UID=SOME_USERNAME;PWD=SOME_PASSWORD;initial catalog=test;connection timeout=30"/>-->
  </appSettings>
Run Code Online (Sandbox Code Playgroud)

我尝试编辑applicationHost.config.
加载用户个人资料对我来说已经是真的

我的ApplicationHost.config文件

 <applicationPools>

            <add name="Classic .NET AppPool" managedRuntimeVersion="v2.0" managedPipelineMode="Classic" />
            <add name=".NET v2.0 Classic" managedRuntimeVersion="v2.0" managedPipelineMode="Classic" />
            <add name=".NET v2.0" managedRuntimeVersion="v2.0" />
            <add name=".NET v4.5 Classic" managedRuntimeVersion="v4.0" managedPipelineMode="Classic" />
            <add name=".NET v4.5" managedRuntimeVersion="v4.0" />
            <add name="ASP.NET v4.0" managedRuntimeVersion="v4.0">

            <add name="DefaultAppPool" autoStart="true" managedRuntimeVersion="v4.0" managedPipelineMode="Integrated">
           <processModel identityType="ApplicationPoolIdentity" …
Run Code Online (Sandbox Code Playgroud)

sql-server asp.net iis sql-server-2016

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

如何在SQL SERVER中将AVG()函数转换为十进制

救命!我有一个看起来像下面的表.

SELECT *
FROM tblshipline 
WHERE MethodShipped = 'FEDEX'
Run Code Online (Sandbox Code Playgroud)

然后我明白了

Qtyshipped
2
3
15
3
10
9
10
Run Code Online (Sandbox Code Playgroud)

现在的问题是计算AVERAGE qtyshipped并将其四舍五入到2位十进制数.

我的代码是

SELECT CONVERT(decimal(8,6), ROUND(AVG(Qtyshipped),2))  
FROM TblShipLine
WHERE MethodShipped= 'FEDEX'
Run Code Online (Sandbox Code Playgroud)

答案应该是7.430000,但它总会回来7.000000.我感谢任何建议,谢谢!

sql sql-server sql-server-2016

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

FOR JSON路径在AZURE SQL上返回较少的行数

我正在使用AZURE SQL(SQL Server 2016)并创建一个查询来为我提供JSON对象的输出.我FOR JSON PATH在查询结束时添加.

当我执行该过程而不添加FOR JSON PATH查询时,我得到244行(我的表中没有记录); 但是当我通过添加FOR JSON PATH我获取消息33行来执行该过程时,我也得到了被截断的JSON对象.

我使用不同类型的查询测试了这一点,包括只选择10列的简单查询,但我总是得到更少的行数,FOR JSON PATH并且最后截断了JSON对象.

这是我的查询

SELECT 
    [Id]
    ,[countryCode]
    ,[CountryName]
    ,[FIPS]
    ,[ISO1]
    ,[ISO2]
    ,[ISONo]
    ,[capital]
    ,[region]
    ,[currency]
    ,[currencyCode]
    ,[population]
    ,[timeZone]
    ,[timeZoneCode]
    ,[ISDCode]
    ,[currencySymbol]
FROM 
    [dbo].[countryDB]
Run Code Online (Sandbox Code Playgroud)

上面的查询返回2行.

我使用以下查询来获取JSON中的输出

SELECT 
    [Id]
    ,[countryCode]
    ,[CountryName]
    ,[FIPS]
    ,[ISO1]
    ,[ISO2]
    ,[ISONo]
    ,[capital]
    ,[region]
    ,[currency]
    ,[currencyCode]
    ,[population]
    ,[timeZone]
    ,[timeZoneCode]
    ,[ISDCode]
    ,[currencySymbol]
FROM 
    [dbo].[countryDB] 
FOR JSON PATH
Run Code Online (Sandbox Code Playgroud)

上面的查询返回33行,输出为

[{"Id":1,"countryCode":"AD","CountryName":"Andorra","FIPS":"AN","ISO1":"AD","ISO2":"AND","ISONo":20,"capital":"Andorra la Vella","region":"Europe","currency":"Euro","currencyCode":"EUR","population":67627,"timeZone":2.00,"timeZoneCode":"DST","ISDCode":"+376"},{"Id":2,"countryCode":"AE","CountryName":"United Arab Emirates","FIPS":"AE","ISO1":"AE","ISO2":"ARE","ISONo":784,"capital":"Abu Dhabi","region":"Middle East","currency":"UAE Dirham","currencyCode":"AED","population":2407460,"timeZone":4.00,"timeZoneCode":"STD","ISDCode":"+971"},{"Id":3,"countryCode":"AF","CountryName":"Afghanistan","FIPS":"AF","ISO1":"AF","ISO2":"AFG","ISONo":4,"capital":"Kabul","region":"Asia","currency":"Afghani","currencyCode":"AFA","population":26813057,"timeZone":4.50,"timeZoneCode":"STD","ISDCode":"+93"},{"Id":4,"countryCode":"AG","CountryName":"Antigua and Barbuda","FIPS":"AC","ISO1":"AG","ISO2":"ATG","ISONo":28,"capital":"Saint Johns","region":"Central America …
Run Code Online (Sandbox Code Playgroud)

sql sql-server-2016 azure-sql-database

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

在T-SQL OPENJSON查询中转义字符

我有以下JSON数据

DECLARE @jsonData NVARCHAR(MAX)
SET @jsonData =
'{  
   "insertions":[  
      {  
         "id":"58735A79-DEA8-462B-B3EB-C2797CA9D44E",
         "last-modified":"2017-08-08 13:07:32",
         "label":"HelloWorld1"
      },
      {  
         "id":"00565BCD-4240-46CF-A48F-849CB5A8114F",
         "last-modified":"2017-08-08 13:11:38",
         "label":"HelloWorld12"
      }
   ]
}'
Run Code Online (Sandbox Code Playgroud)

并尝试从中执行选择:

SELECT
    *
FROM
    OPENJSON(JSON_QUERY(@jsonData,'$.insertions'))
WITH
    (uuid UNIQUEIDENTIFIER '$.id',
    modified DATETIME '$.last-modified',
    Label NVARCHAR(128) '$.label'
    )
Run Code Online (Sandbox Code Playgroud)

它不喜欢最后修改字段中的破折号.

消息13607,级别16,状态4,行18
JSON路径格式不正确.在位置6处找到意外的字符" - ".

有没有办法逃避查询中的破折号?如果没有破折号,一切正常.

根据需要支持JSON,我使用兼容级别= 130的SQL Server 2016

sql t-sql json escaping sql-server-2016

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

C#Dapper使用JSON_VALUE进行SQL Server 2016

我想使用JSON_VALUE以下方法查询表中的数据:

var str = "123";
var value = "Name"
using(var conn = GetMyConnection())
{
   var result = conn.QueryFirstOrDefault<string>(
      @"SELECT [Id] FROM [dbo].[MyTable]
         WHERE JSON_VALUE([JsonColumn], @MyQuery) = @Str",
      new
      {
         MyQuery = $"$.{value}",
         Str = str
      }
   );
}
Run Code Online (Sandbox Code Playgroud)

我在SQL Server中尝试这个,它正在工作:

SELECT [Id] FROM [dbo].[MyTable]
WHERE JSON_VALUE([JsonColumn], '$.Name') = '123'
Run Code Online (Sandbox Code Playgroud)

我应该如何调整我的代码?

c# t-sql dapper sql-server-2016 json-query

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

如何分离变量和值,然后插入表中?

问题

存储过程正在接收变量和值列表以及分隔符.此存储过程需要将它们插入表中.

--Example table
create table #tempo
(
    Variable1 int,
    Variable2 int,
    Variable3 int
)
Run Code Online (Sandbox Code Playgroud)

这些是存储过程的参数:

declare @variableList varchar(100)
declare @valueList varchar(100)
declare @separator char(1)

set @variableList = 'Variable1#Variable2#Variable3'
set @valueList = '1111#2222#3333'
set @separator = '#'
Run Code Online (Sandbox Code Playgroud)

结果

我想要实现的是:

select * from #tempo

+---------+---------+---------+
|Variable1|Variable2|Variable3|
+---------+---------+---------+
|1111     |2222     |3333     |
+---------+---------+---------+
Run Code Online (Sandbox Code Playgroud)

一种方法

我可以使用循环并构建动态SQL,但我想避免它.除了不使用动态SQL的明显原因之外,循环结构很难维护,解释和测试也可能成为一个问题.

理想的方式

我正在考虑一种更优雅的方法,例如使用string_splitcoalesce等.但是如果不使用动态SQL或循环,就无法找到方法.

t-sql sql-server loops dynamic-sql sql-server-2016

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

SQL Server中的分区或索引大表

我有一张由40亿+行和50列组成的大表,其中大多数是datetimenumeric除少数几个以外varchar

数据将每周(约2000万行)插入表中。

我期望在某些datetime列以及几个列上使用where子句进行查询varchar。表中没有主键。

没有索引,也不对表进行分区。我正在使用SQL Server 2016。

我知道我需要对表进行分区或建立索引,但是我不确定采用哪种方法或实际上两种方法都可以。

由于表很大,我应该首先创建索引还是应该首先创建分区?如果我确实创建了索引然后又创建了分区,那么我应该怎么做以每周提供新数据来维护这些索引。

编辑:此外,表上的最小更新和删除预计

sql-server indexing partitioning sql-server-2016

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

如何在SQL Server 2016中现有的内存优化表上更改DURABILITY选项?

我想将SQL Server 2016中内存优化表的DURABILITY从SCHEMA_AND_DATA更改为SCHEMA_ONLY。

微软的文档表明,以下ALTER TABLE语句应该工作:

ALTER TABLE mem_opt_table
DURABILITY = SCHEMA_ONLY
Run Code Online (Sandbox Code Playgroud)

但是它给出了以下错误:

Msg 102, Level 15, State 1, Line 12
Incorrect syntax near 'DURABILITY'.
Run Code Online (Sandbox Code Playgroud)

更改桌子上的耐用性设置的正确语法是什么?我还缺少其他步骤吗?

sql-server memory-optimized-tables sql-server-2016

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