如何告诉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功能,欢迎任何其他想法)
一些假设:
谢谢
SQL Server 2016系统版本控制很酷.我使用的是免费的开发者版本.谢谢MS!
我无法弄清楚它是否会给我许多关系的版本控制.我有一个具有角色集合的User对象,反之亦然.实体框架已经产生的UserRoles保存之间的关系表User和Roles.我可以使用这篇文章http://sqlhints.com/tag/modify-existing-table-as-system-versioned-temporal-table/打开User和Roles表的系统版本控制.
但是,我无法开启UserRoles.我收到一个错误
将SYSTEM_VERSIONING设置为ON失败,因为表具有带有级联DELETE或UPDATE的FOREIGN KEY.
这是否意味着我们无法知道许多关系的版本控制?
例如.
所以,如果我想知道6/1上用户的状态,我认为只有开启系统版本操作才有可能UserRoles,但这不起作用.
这是可行的还是不受SQL Server 2016支持?如果没有,还有其他方法可以实现吗?
我最近在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) 我正在尝试使用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",例如,它不起作用.
我正在使用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) 我有以下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 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) 问题
存储过程正在接收变量和值列表以及分隔符.此存储过程需要将它们插入表中.
--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_split或coalesce等.但是如果不使用动态SQL或循环,就无法找到方法.
我有一张由40亿+行和50列组成的大表,其中大多数是datetime或numeric除少数几个以外varchar。
数据将每周(约2000万行)插入表中。
我期望在某些datetime列以及几个列上使用where子句进行查询varchar。表中没有主键。
没有索引,也不对表进行分区。我正在使用SQL Server 2016。
我知道我需要对表进行分区或建立索引,但是我不确定采用哪种方法或实际上两种方法都可以。
由于表很大,我应该首先创建索引还是应该首先创建分区?如果我确实创建了索引然后又创建了分区,那么我应该怎么做以每周提供新数据来维护这些索引。
编辑:此外,表上的最小更新和删除预计
我想将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-2016 ×10
sql-server ×7
sql ×3
t-sql ×3
json ×2
asp.net ×1
dynamic-sql ×1
escaping ×1
iis ×1
indexing ×1
loops ×1
partitioning ×1