使用SQL Server,如何拆分字符串以便访问项目x?
拿一个字符串"Hello John Smith".如何按空格分割字符串并访问索引1处应该返回"John"的项目?
给定一个表值函数,如dbo.Split()从"T-SQL:对面字符串连接-如何将字符串分割成多个记录",我如何通过多行作为参数?
这有效:
SELECT *
FROM dbo.Split
(',', (SELECT myColumn FROM Stuff WHERE id = 22268))
WHERE ISNULL(s,'') <> ''
Run Code Online (Sandbox Code Playgroud)
它返回:
pn s
----------- -----------
1 22351
2 22354
3 22356
4 22357
5 22360
Run Code Online (Sandbox Code Playgroud)
但这不是:
SELECT *
FROM dbo.Split
(',', (SELECT myColumn FROM Stuff))
WHERE ISNULL(s,'') <> ''
Run Code Online (Sandbox Code Playgroud)
这也不是:
SELECT * FROM dbo.Split_temp(',', myColumn), Stuff
Run Code Online (Sandbox Code Playgroud)
文档说:
当在子查询的FROM子句中调用返回表的用户定义函数时,函数参数不能引用外部查询中的任何列.
我正在寻找的那种结果集看起来像:
id pn s
----------- ----------- -----------
22268 1 22351
22268 2 22354
22268 3 22356
22268 4 …Run Code Online (Sandbox Code Playgroud) 可能重复:
参数化SQL IN子句?
在SQL Server中,我想为此做些什么......
DECLARE @Values varchar(1000)
SET @Values = 'A, B, C'
SELECT
blah
FROM
foo
WHERE
myField IN (@Values)
Run Code Online (Sandbox Code Playgroud)
这有可能或如何实现这一目标?
搜索查询返回此错误.我有一种感觉,因为当我试图对另一个对象进行ORM时,in子句在下属对象上是巨大的.
显然,在子句中不应该一次构建1个参数.谢谢ibatis.
DECLARE @script VARCHAR(MAX);
SET @script =
'
create table ali(id decimal(10,0));
drop table ali;
go
create table ali(id decimal(10,0));
drop table ali;
'
EXEC (@script);
Run Code Online (Sandbox Code Playgroud)
执行上述查询时出现错误消息.请告诉我你是否有解决这个问题的想法.
消息102,级别15,状态1,行4'go'附近的语法不正确.
注意:上面创建和删除创建表的代码只是例如,我有一些其他动态查询与go语句.请不要给出这个答案.
DECLARE @script VARCHAR(MAX),
@script1 VARCHAR(MAX);
SET @script =
'
create table ali(id decimal(10,0));
drop table ali;
';
SET @script1 =
'
create table ali(id decimal(10,0));
drop table ali;
';
EXEC (@script);
EXEC (@script1);
Run Code Online (Sandbox Code Playgroud) 我的数据库上有一张表.我的表名是"公司".我想将数据"company_name"更改为大写首字母.例如;
"ABC公司"
"DEF PLASTICITY"
如
"Abc公司"
"可塑性"
我知道我应该使用"UPDATE"命令.但是怎么样?谢谢你的帮助!
(CONCAT不起作用)
我真的很喜欢这里的一些建议,提供一些背景信息我正在使用将Exchange 2007中的邮件跟踪日志插入SQL.由于我们每天有数百万行,我使用Bulk Insert语句将数据插入到SQL表中.
实际上我实际上是Bulk Insert到一个临时表中,然后从那里我将数据合并到实时表中,这是用于测试解析问题,因为某些字段否则有引号等值.
这种方法效果很好,但收件人地址列是由a分隔的分隔字段的事实除外; 角色,有时可能会非常长,因为可能有很多电子邮件收件人.
我想采用这一列,并将值拆分为多行,然后将其插入另一个表中.问题是我正在尝试的任何事情要么花费太长时间,要么不按我想要的方式工作.
以此示例数据为例:
message-id recipient-address
2D5E558D4B5A3D4F962DA5051EE364BE06CF37A3A5@Server.com user1@domain1.com
E52F650C53A275488552FFD49F98E9A6BEA1262E@Server.com user2@domain2.com
4fd70c47.4d600e0a.0a7b.ffff87e1@Server.com user3@domain3.com;user4@domain4.com;user5@domain5.com
Run Code Online (Sandbox Code Playgroud)
我希望在我的收件人表格中将其格式化为:
message-id recipient-address
2D5E558D4B5A3D4F962DA5051EE364BE06CF37A3A5@Server.com user1@domain1.com
E52F650C53A275488552FFD49F98E9A6BEA1262E@Server.com user2@domain2.com
4fd70c47.4d600e0a.0a7b.ffff87e1@Server.com user3@domain3.com
4fd70c47.4d600e0a.0a7b.ffff87e1@Server.com user4@domain4.com
4fd70c47.4d600e0a.0a7b.ffff87e1@Server.com user5@domain5.com
Run Code Online (Sandbox Code Playgroud)
有没有人对我如何做到这一点有任何想法?
我非常了解PowerShell,所以我尝试了,但即使在28K记录上的foreach循环也需要永久处理,我需要能够尽可能快速/高效地运行的东西.
谢谢!
我有一个整数或字符串列表,需要将它作为Delphi DataSet的参数传递.怎么做?
这是一个例子.MyQuery是这样的:
select * from myTable where intKey in :listParam
Run Code Online (Sandbox Code Playgroud)
我将参数设置为列表或数组或其他:
MyQuery.ParamByName('listParam').AsSomething := [1,2,3];
Run Code Online (Sandbox Code Playgroud)
它会导致此查询发送到sql server:
select * from myTable where intKey in (1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
如果解决方案也可以使用字符串,那么这个查询会更好:
select * from myTable where stringKey in :listParam
Run Code Online (Sandbox Code Playgroud)
成为:
select * from myTable where stringKey in ('a', 'b', 'c')
Run Code Online (Sandbox Code Playgroud)
我相信这是一个简单的问题,但"IN"不是搜索网络的好关键字.
请回答我应该如何配置IDE中的参数,查询以及如何传递参数.
我正在使用Delphi 7.
编辑:我正在考虑答案是" 不可能直接做 ".如果有人给我一个非hackish的答案,接受的答案将被更改.
我有一个varchar @ a ='a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p',有| 划定的价值观.我想将此变量拆分为数组或表.有没有人对此有任何想法.
我正在为数据库中的网络的各个方面建模.我们正在处理的一个更烦人的问题是创建子网范围,然后确定给定的IP集合是否在这些范围内.我们当前的模型通过以下列说明了IPv4和IPv6之间的差异:
[subnet_sk] [int] IDENTITY(1,1) NOT NULL,
[ipv6_network] [char](39) NULL,
[ipv6_broadcast] [char](39) NULL,
[ipv4_network] [char](15) NULL,
[ipv4_broadcast] [char](15) NULL,
[network_type] [char](4) NOT NULL
Run Code Online (Sandbox Code Playgroud)
上面的模式做了一些重要的假设,这些假设很重要.我们正在利用完全扩展的IP(192.168.001.001vs. 192.168.1.1)进行存储和比较.我们做出这个决定是因为围绕在SQL服务器中以数字方式存储IPv6地址的问题(bigints是无符号的,这意味着我们必须使用六列来表示IPv6).
给定此表模式,可以很容易地编写一个select语句来确定任一类型的IP是否在表中的范围之间:
select *
from subnet
where '1234:0000:0000:0000:fc12:00ab:0042:1050'
between ipv6_network
and ipv6_broadcast
-- or alternatively for IPv4
select *
from subnet
where '192.168.005.015'
between ipv4_network
and ipv4_broadcast
Run Code Online (Sandbox Code Playgroud)
更为困难的是,IP列表确定哪些IP位于子网范围之间.IP列表将由用户输入提供,不存储在数据库中.显然,对于存储在数据库中的数据,我可以进行类似的连接,如下例所示.
例如,用户可以提供1234:0000:0000:0000:fc12:00ab:0042:1050,192.168.001.001和192.168.1.1.我提出的唯一解决方案是使用表值函数来拆分 IP 列表并使用以下之间执行连接:
-- this only covers the IPv4 addresses from the …Run Code Online (Sandbox Code Playgroud) sql-server ×8
sql ×6
t-sql ×6
.net ×1
c# ×1
delphi ×1
delphi-7 ×1
ibatis.net ×1
ipv4 ×1
ipv6 ×1
split ×1
sql-update ×1
uppercase ×1