标签: sql-server-2016

生成分层数据的复杂递归 SQL

我正在尝试评估商店访客对 COVID-19 传播的影响。

这是一个简单的场景:

  1. 访客 A 走进商店,遇到了员工 1 @ Time = 0。
  2. 然后,访问者 A 在时间 = 1 时遇到了员工 2。
  3. 访客 B 走进商店并遇到 Employee1 @ Time = 1。
  4. VisitorB 然后遇到 Employee3 @ Time = 2。
  5. 访客A离开商店。

当我收集所有访问者数据以及他们在一段时间内遇到的人时,数据集如下所示:

visitorByEmployee

| VisitorID | EmployeeID | Contact           |
+-----------+------------+-------------------+
| 100       |   X123     | 3/11/2020 1:00    |
| 100       |   X124     | 3/11/2020 1:10    |
| 101       |   X123     | 3/12/2020 1:11    |
| 101       |   X125     | 3/11/2020 1:20    |
| …
Run Code Online (Sandbox Code Playgroud)

sql common-table-expression recursive-cte sql-server-2016

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

在 sql-server-2016 的输出表中保留来自 data.frame 的列名

我有一张桌子sql-server-2016

CREATE TABLE #tempData (A int not null) 
 INSERT INTO #tempData   VALUES (0);
GO
Run Code Online (Sandbox Code Playgroud)

现在我可以调用我的 R 脚本,将表作为输入数据(包括列名):

EXECUTE  sp_execute_external_script
                @language = N'R'
              , @script = N'
                        df <- InputDataSet
                        df$B <- 1L'
              , @input_data_1 = N'SELECT * FROM #tempData'
              , @output_data_1_name = N'df'
WITH RESULT SETS (
    (A int not null, B int not null)
);
Run Code Online (Sandbox Code Playgroud)

返回:

A   B
0   1
Run Code Online (Sandbox Code Playgroud)

正如预期的那样。但是我可以在不指定名称{A,B} 的情况下执行相同操作吗,即它将data.frame直接使用来自 的名称。

sql-server r sql-server-2016

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

是什么导致 SQL LocalDB 上出现“指定的 LocalDB 版本在此计算机上不可用”错误?

我刚刚在新工作站上全新安装了 VS2015 Update 2,并开始运行一些使用 SQL LocalDb 的集成测试。他们因以下原因而失败SqlException

附加信息:本地数据库运行时:无法创建命名实例。

指定的 LocalDB 版本在此计算机上不可用。

我们使用的连接字符串是(并且以前使用 VS2013):

server=(localdb)\SystemTest;Integrated Security=true
Run Code Online (Sandbox Code Playgroud)

如您所见,这没有指定任何版本,实际上是在尝试连接到命名实例。

如果我跑sqllocaldb v我得到:

Microsoft SQL Server 2014 (12.0.2000.8)
Microsoft SQL Server 2016 Release Candidate 0 (RC0) (13.0.1100.286)
Run Code Online (Sandbox Code Playgroud)

我尝试手动创建和启动“SystemTest”实例,甚至指定版本,但两者似乎都导致抛出相同的 SqlException。

连接字符串语法是否已更改?我错过了什么?

更新: 如果我使用自动实例(现在在 SQL2014 及更高版本上命名为“MSSQLLocalDb”),代码工作得很好。比较这两个实例时,sqllocaldb i除了一个是自动创建之外,它们都是相同的。他们都在Running州内。所以看起来问题只发生在命名实例上。

sql-server localdb sql-server-2014 sql-server-2016

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

使用 case 语句时,SQL Server 2016 FOR JSON PATH 返回字符串而不是数组

我正在尝试使用 SQL Server 2016 构建一个包含数组的 JSON 对象。

数组的源数据本身就是 JSON,因此我在JSON_QUERYselect 语句内部使用,并将 FOR JSON 子句应用于该 select 语句。

一切都工作得很好,直到我将JSON_QUERY子句包装在CASE语句中(在某些情况下不得包含数组,即必须为空)。

下面的代码说明了这个问题:

declare  @projects nvarchar(max) = '{"projects": [23439658267415,166584258534050]}'
declare @id bigint = 123

SELECT 
      [data.array1] = JSON_QUERY(@projects, '$.projects') -- returns an array - perfect.
    , [data.array2] = CASE WHEN 1 is NOT NULL 
                           THEN JSON_QUERY(@projects, '$.projects') 
                           ELSE NULL END -- returns an array - still good!
    , [data.array3] = CASE WHEN @id is NOT NULL
                           THEN JSON_QUERY(@projects, '$.projects') 
                           ELSE …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server arrays json sql-server-2016

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

重命名表后更新时对象名称无效

尝试重命名表并使用它时遇到一个非常奇怪的问题。
我有一个名为oldTable的表并将其重命名为newTable
我可以使用以下方法在此表上成功使用select

SELECT * FROM database.dbo.newTable;
Run Code Online (Sandbox Code Playgroud)

但是当我尝试像这样使用更新时

UPDATE database.dbo.newTable SET foo = bar where id = 1;
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Msg 208, Level 16, State 1, Procedure archive, Line 4 [Batch Start Line 0]
Invalid object name 'oldTable'.
Run Code Online (Sandbox Code Playgroud)

看起来名称 oldTable 存储在某处,并通过某种引用在此处使用。尝试更新时,它同时发生在 ssms 和原始 php+sql 上。
任何人有任何想法?

sql database ssms sql-server-2016

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

SSIS 错误:对象名称无效 - 但对象存在并且查询在 SSMS 中运行

我目前正在使用 Visual Studio 2015(在 BIDS 2008 中制作)更新我们所有的 ETL,并将它们重新部署到在 SQL Server 2016(最初是 2008R2)上运行的新报告服务器。

在更新其中一个 ETL 时,我收到此错误:


HRESULT 异常:0xC0202009 负载暂存表错误 [OLE DB 源 [129]]:SSIS 错误代码 DTS_E_OLEDBERROR。发生 OLE DB 错误。错误代码:0x80004005。OLE DB 记录可用。来源:“Microsoft SQL Server Native Client 10.0” Hresult:0x80004005 描述:“无效的对象名称‘dbo.TimeSheets’。”。


这是我尝试过的:

  • 检查我的连接字符串以确保它们是正确的。
  • 检查架构以确保它存在且正确。
  • 从 SSMS 运行查询并且它起作用了。
  • Ctrl+ Shift+R刷新智能感知。
  • 检查是否存在另一个同名表。
  • 重新启动 Visual Studio 和 SSMS。

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

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

如何从 JSON 字符串中读取具有长值的属性?

我有一个 JSON 对象,其中一个属性的值很长。当我尝试使用 提取此值时JSON_VALUE(),它返回 null。

declare @json nvarchar(max) =
'
{
    "AVeryLongValue": "Founded in 2008, Stack Overflow is the largest, most trusted online community for developers to learn, share their knowledge, and build their careers. More than 50 million professional and aspiring programmers visit Stack Overflow each month to help solve coding problems, develop new skills, and find job opportunities. Stack Overflow partners with businesses to help them understand, hire, engage, and enable the worlds developers. Our products …
Run Code Online (Sandbox Code Playgroud)

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

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

SSRS - 仅显示前 N 个类别组,不包括条形图中末尾的重复组

考虑下表

在此处输入图片说明

我需要生成一个类别组 =“国家”的条形图。该图表应仅显示基于国家/地区记录计数的前 3 个组。我已经为类别组应用了一个过滤器,将 Count(Country) 的前 N ​​个条件指定为 3。生成的图表根据计数按预期应用过滤器,但即使存在具有重复值的条,我也只需要显示 3 个条。

下面是我得到的图表。

在此处输入图片说明

预期结果

在此处输入图片说明

现在我知道了,我可以在我的数据集中用排名值创建一个额外的列,然后在该列上应用过滤器以获得预期的结果(我已经尝试过这个,并且它有效)

有没有办法在不改变底层数据集的情况下达到预期的结果?

注意:上面显示的数据集是我的数据集的高度简化版本。实际上,我有一个包含很多列的庞大数据集。相同的数据集已用于各种图表(在不同的列上分组)。

sql-server reporting-services business-intelligence sql-server-2016 ssrs-2016

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

如何在列上添加隐藏属性?

创建时态表时,我们需要定义开始和结束日期时间列,这些列在或hidden中不可见。我想再添加一列,其中包含有关已提交更改的用户的信息。SELECT *INSERT without columns

问题是,我收到以下错误:

Msg 13735, Level 16, State 1, Line 10
Cannot alter HIDDEN attribute on column 'UserID' in table 'GK' because this column is not a generated always column.
Run Code Online (Sandbox Code Playgroud)

这是代码:

DROP TABLE IF EXISTS GK;

CREATE TABLE GK
(
    [ID] INT
   ,[UserID] BIGINT DEFAULT (CONVERT(BIGINT, SESSION_CONTEXT(N'user_id')))  
)

ALTER TABLE GK
ALTER COLUMN [UserID] ADD HIDDEN;
Run Code Online (Sandbox Code Playgroud)

为什么我不允许在此类列上添加此属性?

t-sql sql-server sql-server-2016 temporal-tables

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

SQL Server 2016 中的 STRING_AGG 替换

我想聚合单列值,中间有分隔符并带有一些前缀。下面是尝试过的有效代码。

SELECT concat('TNB/IAG/',STRING_AGG(WF_ValStr, '/')) AS Result
    FROM wfattrdata where wf_id=35262472 and  WF_AttrID in (28,29,30,31,33);
Run Code Online (Sandbox Code Playgroud)

我可以在最新的 MSSql 版本中得到以下预期结果。

TNB/IAG/1/2/3/4/5
Run Code Online (Sandbox Code Playgroud)

如何替换上述查询以使其在 SQL Server 2016 中工作?

t-sql sql-server string-aggregation sql-server-2016

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