标签: 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 JSON_Modify,如何更新全部?

我正在尝试使用Json_Modify更新所有列的值:

DECLARE @JSON NVARCHAR(MAX)
SET @JSON = 
N'{
"A":1,
"TMP": [    
    {"A":"VALUE1", "B": "VALUE2", "C": 1},
    {"A":"VALUE3", "B": "VALUE4", "C": 2},
    {"A":"VALUE5", "B": "VALUE6", "C": 3}]}
'

SET @JSON = JSON_MODIFY(@JSON, '$.TMP.A', 'JEJE')

SELECT * FROM OPENJSON(@JSON, '$.TMP') WITH ( A NCHAR(10), B NCHAR(10), C INT )
Run Code Online (Sandbox Code Playgroud)

我需要用"JEJE"更新所有列"A",例如,它不起作用.

sql-server json sql-server-2016 sql-server-json

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

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
查看次数

使用SQL Server全文搜索以特定顺序匹配折叠形式的单词

我想使用SQL Server全文搜索来查找以特定顺序出现的屈折形式的单词.所以的话method,并apparatus会匹配These are the methods I'm using with the apparatuses,但没有This apparatus is used with these methods.

有没有办法做到这一点?看起来很简单,但我一无所获.

我尝试CONTAINS过:

'NEAR((method,apparatus), MAX, TRUE) AND FORMSOF(INFLECTIONAL,method) AND FORMSOF(INFLECTIONAL,apparatus)'

'FORMSOF(INFLECTIONAL,NEAR((method,apparatus), MAX, TRUE))'

'NEAR((FORMSOF(INFLECTIONAL,method),FORMSOF(INFLECTIONAL,apparatus)), MAX, TRUE)'
Run Code Online (Sandbox Code Playgroud)

sql-server full-text-search sql-server-2016

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

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

问题

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

--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
查看次数