使用SQL Server,如何拆分字符串以便访问项目x?
拿一个字符串"Hello John Smith".如何按空格分割字符串并访问索引1处应该返回"John"的项目?
当使用SQL或MySQL(或任何关系数据库)时 - 我知道将数据保存在常规列中更适合索引和其他目的......
加载和保存JSON数据有时候要简单得多.并使开发更容易.
是否存在用于JSON在DB中保存原始数据的"黄金规则" ?
这样做是绝对错误的做法吗?
给出了非常好的答案,但毫无疑问,最有组织的是@Shnugo给出的答案,值得赏心悦目.
还想指出@Gordon Linoff和@Amresh Pandey给出的解释其他特殊用例的答案.
感谢上帝,大家好!
我有脚本,我想首先删除视图,然后创建它.我知道如何放桌子:
IF EXISTS (SELECT * FROM sys.tables WHERE name = 'table1' AND type = 'U') DROP TABLE table1;
Run Code Online (Sandbox Code Playgroud)
所以我对观点做了同样的事情:
IF EXISTS (SELECT * FROM sys.views WHERE name = 'view1' AND type = 'U') DROP VIEW view1;
create view1 as(......)
Run Code Online (Sandbox Code Playgroud)
然后我得到了错误:
'CREATE VIEW'必须是查询批处理中的第一个语句.
我正在使用SQL Server 2008 R2中的FOR XML语句创建HL7 Continuity of Care Document(CCD).
我用这种方法做了很多,但这是我第一次在HTML表格中表示部分数据,这给我带来了麻烦.
所以,我在表格中有以下信息:
Problem | Onset | Status
---------------------------------
Ulcer | 01/01/2008 | Active
Edema | 02/02/2005 | Active
Run Code Online (Sandbox Code Playgroud)
我试图渲染以下内容
<tr>
<th>Problem</th>
<th>Onset</th>
<th>Status</th>
</tr>
<tr>
<td>Ulcer</td>
<td>01/01/2008</td>
<td>Active</td>
</tr>
<tr>
<td>Edema</td>
<td>02/02/2005</td>
<td>Active</td>
</tr>
Run Code Online (Sandbox Code Playgroud)
我正在使用此查询:
SELECT p.ProblemType AS "td"
, p.Onset AS "td"
, p.DiagnosisStatus AS "td"
FROM tblProblemList p
WHERE p.PatientUnitNumber = @PatientUnitNumber
FOR XML PATH('tr')
Run Code Online (Sandbox Code Playgroud)
我一直得到以下内容:
<tr>
<td>Ulcer2008-01-01Active</td>
</tr>
<tr>
<td>Edema2005-02-02Active</td>
</tr>
Run Code Online (Sandbox Code Playgroud)
有人有任何建议吗?
我需要创建一个函数,它将返回分隔字符串的第n个元素.
对于数据迁移项目,我使用SQL脚本将存储在SQL Server数据库中的JSON审核记录转换为结构化报告.目标是提供脚本使用的sql脚本和sql函数,而无需任何代码.
(这是一个短期修复,将在ASP.NET/MVC应用程序中添加新的审核功能时使用)
可用的表格示例不缺少分隔字符串.我选择了一个Common Table Expression示例http://www.sqlperformance.com/2012/07/t-sql-queries/split-strings
示例:我想从'1,222,2,67,888,1111'返回67
我有一个复杂的SQL查询,可以简化到下面:
Select ColA,ColB,ColC,ColD
From MyTable
Where (ColA In (Select ItemID From Items Where ItemName like '%xxx%')
or ColB In (Select ItemID From Items Where ItemName like '%xxx%'))
Run Code Online (Sandbox Code Playgroud)
如您所见,子查询出现两次.编译器是否足够智能来检测它并仅获取子查询的结果一次?或者子查询运行两次?
仅供参考,表项目大约有20,000行,MyTable有大约200,000行.
是否有另一种方法来重写此SQL语句,以便子查询只出现/运行一次?
更新:主查询中的Where子句是动态的,仅在需要时添加(即仅在用户搜索"xxx"时).因此,不可能对主select语句进行更改或重新构造查询.
我正在尝试创建一个用户定义的函数来调用其中的系统RAND()函数,当我尝试使用以下消息创建它错误的函数时:
消息443,级别16,状态1,过程getNumber,行10
在函数内无效使用副作用运算符'rand'.
我的功能代码:
CREATE FUNCTION getNumber(@_id int)
RETURNS DECIMAL(18,4)
AS
BEGIN
DECLARE @RtnValue DECIMAL(18,4);
SELECT TOP 1 @RtnValue = EmployeeID
FROM dbo.Employees
ORDER BY EmployeeID DESC
SET @RtnValue = RAND() * @RtnValue * (1/100)
RETURN @RtnValue;
END
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
当我尝试在SQL Server 2008 R2中创建索引时,我收到以下错误.
CREATE INDEX失败,因为以下SET选项具有不正确的设置:'ANSI_PADDING'
索引脚本是
CREATE UNIQUE NONCLUSTERED INDEX [IX_TabPermission_Roles] ON [dbo].
[TabPermission]
(
[RoleID] ASC,
[TabID] ASC,
[PermissionID] ASC
)
INCLUDE ( [AllowAccess])
WHERE ([RoleID] IS NOT NULL)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF,
IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)
表定义在这里.在表定义中,您可以发现没有包含char,varchar,binary或varbinary的列.
如果我运行索引创建脚本SET ANSI_PADDING On,它的工作原理.我的问题是为什么我需要设置它On,在表定义中,我没有任何具有char,varchar,binary或varbinary的列.您还可以发现此表中的所有这些列都具有Ansi_padding设置Off.
此表中列的ANSI填充
我已经从字符串中写了很多关于date或datetime转换的答案.生活在一个讲德语的国家,我习惯于处理非us_english日期格式,我习惯使用安全文字(我更喜欢ODBC格式),我从不使用CONVERT第三个参数.这不是问题,请不要在这方面提供答案......
通常人们可以读到,格式yyyy-mm-dd是标准的(ISO8601,ANSI,无论如何),因此文化独立.
今天我必须编辑其中一个较旧的答案,正如我在那里所说,观察到的行为取决于其他东西.
问题是:
DATE和之间存在差异DATETIME?...至少在我的环境中,目前是SQL Server 2014(12.0.4237.0).
我希望,之前没有问过......
试试这个:
没问题,DATE按预期工作
SET LANGUAGE ENGLISH;
DECLARE @dt DATE='2017-01-13';
SELECT @dt;
SELECT CAST('2017-01-13' AS DATE);
SELECT CONVERT(DATE,'2017-01-13'); --no culture / format specified
GO
SET LANGUAGE GERMAN;
DECLARE @dt DATE='2017-01-13';
SELECT @dt;
SELECT CAST('2017-01-13' AS DATE);
SELECT CONVERT(DATE,'2017-01-13');
Run Code Online (Sandbox Code Playgroud)
但是现在检查一下 DATETIME
--No problem here:
SET LANGUAGE ENGLISH;
DECLARE @dt DATETIME='2017-01-13';
SELECT @dt;
SELECT CAST('2017-01-13' …Run Code Online (Sandbox Code Playgroud) 我们正在本地开发一些报告.这些报告将安装在客户的计算机上.但是我们无法在线访问这台机器.
到目前为止我管理的内容:
一个文件夹包含:
此脚本将在ReportServer中创建所有需要的文件夹,加载数据源,然后加载数据集,最后加载报告.这工作,我可以打开门户网站,可以看到我的对象.
下载的rdl文件将其数据集引用设置为普通数据集的名称 - 为什么......我花了几个小时才发现,引用必须包含数据集的完整(内部)路径...现在分页报道确实有效,heureka!
这不起作用
如何通过PowerShell上传移动报告?
如何上传自定义品牌包?
有更好的方法吗?我是PowerShell的新手,因此可以接受任何建议!TIA
删除了脚本片段,因为我自己发布了一个全面的答案...
在我自己的答案的底部有一些悬而未决的问题......我很乐意给予某人赏金,但它似乎丢失了......无论如何:如果Anybode可能至少回答剩下的一些开放问题,那么就有了150分的好机会:-)
sql-server deployment powershell reporting-services ssrs-2017
sql-server ×9
t-sql ×5
sql ×4
split ×2
xml ×2
casting ×1
create-view ×1
date ×1
datetime ×1
deployment ×1
dynamic-sql ×1
html ×1
html-table ×1
indexing ×1
json ×1
powershell ×1
ssrs-2017 ×1
view ×1