使用SQL Server 2016,我可以运行这个简单的查询:
SELECT colA, colB, json_query(infoJson) AS Expr1
FROM dbo.Table_1
FOR json auto
Run Code Online (Sandbox Code Playgroud)
我什至可以将它包装在存储过程中。而且运行得很好。
但是当我尝试根据该语句创建视图时,出现了一些奇怪的情况(至少对我来说):
CREATE VIEW [dbo].[View_1]
AS
SELECT colA, colB, json_query(infoJson) AS Expr1
FROM dbo.Table_1
FOR json auto
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
消息 4511,级别 16,状态 1,过程 View_1,第 5 行 [批处理开始第 9 行] 创建视图或函数失败,因为没有为列 1 指定列名称。
但一旦我发表评论--for json auto,VIEW就会按预期创建。
为什么?我真的很希望它出现FOR JSON在我的 sql 视图中。
我需要将我的客户名称保存在相关数据库中SQL Server,即使我想从存储过程插入,我也不希望通过参数接收它。
考虑下面的问题:我有两个要分割的字符串:
STR1 = 'b;a;c;d;e'
STR2 = '3;1;4;2;5'
Run Code Online (Sandbox Code Playgroud)
我想根据它们的索引拆分和合并这两个字符串,结果是:
b -> 3
a -> 1
c -> 4
d -> 2
e -> 5
Run Code Online (Sandbox Code Playgroud)
我尝试过STRING_SPLIT,但order by对它们进行了排序。
SELECT A.VALUE, B.VALUE FROM (
SELECT VALUE, ROW_NUMBER() OVER(ORDER BY VALUE) AS RW
FROM STRING_SPLIT('b;a;c;d;e', ';')
) A
INNER JOIN (
SELECT VALUE, ROW_NUMBER() OVER(ORDER BY VALUE) AS RW
FROM STRING_SPLIT('3;1;4;2;5', ';')
) B
ON A.RW = B.RW
Run Code Online (Sandbox Code Playgroud)
这会产生以下结果:
a 1
b 2
c 3
d 4
e 5
Run Code Online (Sandbox Code Playgroud) 我一直在阅读尽可能多的同一问题的问题和答案,但我想我的问题需要更多创造性的方法。
所以我这里有一个 JSON 字符串:
declare @json nvarchar(max) =
'{
"propertyObjects": [{
"propertyID": 1
, "title": "foo"
, "class": ""
, "typeid": 150
, "value": "bar"
, "children": [{}]
}, {
"propertyID": 2
, "title": "foo"
, "class": ""
, "typeid": 128
, "value": "bar"
, "children": [{}]
}, {
"propertyID": 3
, "title": "foo"
, "class": ""
, "typeid": 128
, "value": "bar"
, "children": [{
"propertyID": 4
, "title": "foo"
, "class": ""
, "typeid": 128
, "value": "bar" …Run Code Online (Sandbox Code Playgroud) 我在 SQL Server 2016 中有一个包含 200 GB 数据的表。所以我计划在该表中应用 Clustered ColumnStore 以进行磁盘压缩以及更好的性能。
但问题是在该表下有一个数据类型为 NVARCHAR(MAX) 的列,并且列存储索引不支持该数据类型。
所以我的想法是将数据类型从 NVARCHAR(max) 更改为任何其他至少接受同一列中 81446 个字符的数据类型。
我尝试了 SQL 中可用的其他一些数据类型,如 VARCHAR(8000) 但它所做的是删除了 8000 个字符之后的其他数据。
我也试过文字。但同样在 Text 中,由于限制,列存储不适用。
所以你能告诉我我必须使用什么数据类型吗?或者有没有其他方法可以在同一个表中应用 ColumnStore 索引?
我有一个运行并创建所有存储过程的主脚本,但是当我运行脚本时,我在使用该语法的仅有两个地方出错 CREATE OR ALTER PROCEDURE
代码如下:
CREATE OR ALTER PROCEDURE [dbo].[P_ReinitializeStorePlans]
@storeId INT
AS
BEGIN
RETURN;
END
GO
Run Code Online (Sandbox Code Playgroud)
错误如下,我CREATE OR ALTER PROCEDURE稍后在第 2713 行还有另一个同样的错误。
我检查了我的 @@VERSION,它返回 SQL 2016 以及兼容版本的 130。知道为什么这会给我一个错误吗?我假设它是语法的兼容性设置或标志?
我有一个表,其中的'Preference'列存储 JSON 字符串。
a)我想type从rowscompanytype中获取。在我对sqlfiddle的尝试中,我得到了五行,但其中没有数据。
SELECT z.[Type]
FROM FinPreferences p
CROSS APPLY OPENJSON(Preference,'$.companytype.type') WITH (
[Type] INT
) z
WHERE PreferenceID=1
Run Code Online (Sandbox Code Playgroud)
b)如何获得一行字符串的结果,即
1,2,3,4,5
Preference这是列内的数据
{
"companysize":{"min":0,"max":5},
"distance":{"min":100,"max":200},
"companytype":{"type":[1,2,3,4,5]},
"budget":{"min":1000,"max":2000}
}
Run Code Online (Sandbox Code Playgroud)
在 SQL Server Management Studio 中,可以打开一个表并查看其内容,这是通过以下方式完成的:
在 SQL Server 2008 R2 中,有一个按钮(如果我没记错的话,我认为是一个带有感叹号图标的按钮)会在单击时刷新数据。这在测试和开发场景中非常方便。
使用最新版本的 SQL Server Management Studio(至少 2016 年),我再也找不到那个按钮了,所以要刷新数据,我需要关闭表并再次从上下文菜单中选择“编辑前 N 行”。
有谁知道如何刷新数据?
为了更好地表达自己:
这是 ssms 2008R2 中的工具栏(我在仍为 2008R2 的测试服务器上发现了这个):
这 ”!” 图标是我在 ssms2016 中找不到的图标:
我正在尝试打开一个 JSON 字符串并将每个键作为它自己的列。JSON 列位于具有键和多态 ID 的元数据表中。
我希望能够将每个键解析为它自己的列,并为每个多态 id 填充其对应的值。
我可以使用 json_query 逐个解析每个键,但是我看到有一个函数调用 openjson 可以解析整个字符串,但是我不知道如何使用它,因为文档中的示例是在集合上应用该函数值而不是表中的列。如果有比使用 json_query 更简单的方法来解析 JSON 字符串?
我运行了以下查询
SELECT sm.object_id,
v1.object_name,
o.type,
o.type_desc,
sm.definition
FROM sys.sql_modules sm
CROSS APPLY (VALUES (OBJECT_NAME(sm.object_id))) v1 (object_name)
JOIN sys.objects o ON sm.object_id = o.object_id;
Run Code Online (Sandbox Code Playgroud)
object_name并且和之间存在错误关系的三个对象definition。名称和它引用的定义之间不匹配、不对应。
看起来这个表没有跟踪这三个对象的名称和定义的删除或更改。
这种情况怎么能给出呢?我如何“更新”此表或正确修复此问题?