我有一个CLR UDT,它将从表值方法中受益匪浅,ala xml.nodes()
:
-- nodes() example, for reference:
declare @xml xml = '<id>1</id><id>2</id><id>5</id><id>10</id>'
select c.value('.','int') as id from @xml.nodes('/id') t (c)
Run Code Online (Sandbox Code Playgroud)
我想要一些类似我的UDT:
-- would return tuples (1, 4), (1, 5), (1, 6)....(1, 20)
declare @udt dbo.FancyType = '1.4:20'
select * from @udt.AsTable() t (c)
Run Code Online (Sandbox Code Playgroud)
有没有人有这方面的经验?任何帮助将不胜感激.我尝试了一些事情,但都失败了.我找了文档和示例,但没有找到.
是的,我知道我可以创建以UDT为参数的表值UDF,但我非常希望将所有内容捆绑在单一类型中,OO风格.
编辑
Russell Hart发现文档声明不支持表值方法,并修复了我的语法以产生预期的运行时错误(见下文).
在VS2010中,在创建新的UDT之后,我在结构定义的末尾添加了这个:
[SqlMethod(FillRowMethodName = "GetTable_FillRow", TableDefinition = "Id INT")]
public IEnumerable GetTable()
{
ArrayList resultCollection = new ArrayList();
resultCollection.Add(1);
resultCollection.Add(2);
resultCollection.Add(3);
return resultCollection;
}
public static void …
Run Code Online (Sandbox Code Playgroud) 我正在使用Powershell进行一些ETL工作,读取压缩文本文件并根据每行的前三个字符将它们拆分.
如果我只是过滤输入文件,我可以将过滤后的流传输到Out-File并完成它.但我需要将输出重定向到多个目标,据我所知,这不能用简单的管道完成.我已经在使用.NET流读取器来读取压缩的输入文件了,我想知道是否需要使用一个streamwriter来编写输出文件.
天真的版本看起来像这样:
while (!$reader.EndOfFile) {
$line = $reader.ReadLine();
switch ($line.substring(0,3) {
"001" {Add-Content "output001.txt" $line}
"002" {Add-Content "output002.txt" $line}
"003" {Add-Content "output003.txt" $line}
}
}
Run Code Online (Sandbox Code Playgroud)
这看起来像坏消息:每行查找,打开,写入和关闭文件一次.输入文件是巨大的500MB +怪物.
是否有一种惯用的方法来处理这个有效的Powershell构造,或者我应该转向.NET编写器?
是否有我可以使用的(New-Item"path"-type"file")对象的方法?
编辑上下文:
我正在使用DotNetZip库将ZIP文件作为流读取; 因此streamreader
而不是Get-Content
/ gc
.示例代码:
[System.Reflection.Assembly]::LoadFrom("\Path\To\Ionic.Zip.dll")
$zipfile = [Ionic.Zip.ZipFile]::Read("\Path\To\File.zip")
foreach ($entry in $zipfile) {
$reader = new-object system.io.streamreader $entry.OpenReader();
while (!$reader.EndOfFile) {
$line = $reader.ReadLine();
#do something here
}
}
Run Code Online (Sandbox Code Playgroud)
我应该Dispose()
同时使用$ zipfile和$ reader,但这是另一个问题!
我们一直在使用以下堆栈开发一个新的应用程序:
SQL Server 2008 R2 - >实体框架4.2 - > WCF数据服务 - > WCF数据服务客户端库
这都是.NET 4.0
现在,WCF数据服务客户端库非常便于小数据和简单的模式/对象图,但它对于更复杂的模型来说是一个真正的好处.特别是,我们发现DataServiceContext.Links集合可以扩展O(n ^ 2):你加载的对象越多,你的图表嵌套越多,它就越慢,直到加载数据需要更长的时间进入上下文比它从线上读取它.
例如,我们有一个拥有2000个成员的集合,每个成员有4个导航属性.在不扩展任何导航属性的情况下拉动整个集合大约需要1秒钟.扩展所有4个导航属性需要5秒.我们测量了堆栈中各个点的性能,并且大部分额外时间花在客户端上,整理数据.
我们采用了各种技术来解决大数据集:
有谁知道其他任何技术?在加载相关对象时,是否存在可能导致不必要开销的设置?
有时看起来我们正在编写自己的自定义上下文的一半,我想在它变得更精细之前进行健全性检查.
[是的,我意识到WCF数据服务可能是错误的工具.唉,我们已经走了这条路]
BULK INSERT/bcp是否可以从命名管道读取,fifo- style?
也就是说,不是从实际文本文件中读取,而是可以使BULK INSERT/bcp从另一个进程的写入端的命名管道读取?
例如:
要么:
我发现的最接近的是这个家伙(网站现在无法访问),谁管理,编写到命名管道瓦特/ BCP,用他自己的用途和使用情况,如下所示:
start /MIN ZipPipe authors_pipe authors.txt.gz 9
bcp pubs..authors out \\.\pipe\authors_pipe -T -n
Run Code Online (Sandbox Code Playgroud)
但他无法逆转工作.
所以在我开始讨论傻瓜的差事之前,我想知道从带有BULK INSERT或bcp的命名管道读取是否根本可行.如果可能的话,如何设置它?会NamedPipeServerStream
或者在.NET别的东西System.IO.Pipes
命名空间是足够的?
例如,使用Powershell 的示例:
[reflection.Assembly]::LoadWithPartialName("system.core")
$pipe = New-Object system.IO.Pipes.NamedPipeServerStream("Bob")
Run Code Online (Sandbox Code Playgroud)
然后什么?
首先,来自BOL:
修改表变量的查询不会生成并行查询执行计划.当修改非常大的表变量或复杂查询中的表变量时,性能会受到影响.在这些情况下,请考虑使用临时表.有关更多信息,请参见CREATE TABLE(Transact-SQL).读取表变量而不修改它们的查询仍然可以并行化.
这看起来很清楚.读取表变量而不修改它们的查询仍然可以并行化.
但是在Sun Server Agarwal在2008年3月30日的一篇关于tempdb的文章中说,这是一个声誉卓着的SQL Server存储引擎:
涉及表变量的查询不会生成并行计划.
Sunil是否解释了BOL:INSERT,或者FROM子句中是否存在表变量会阻止并行性?如果是这样,为什么?
我正在考虑控制表用例,其中有一个小控件表连接到一个更大的表,映射值,充当过滤器,或两者兼而有之.
谢谢!
sql sql-server parallel-processing table-variable sql-server-2008
sql-server ×3
bcp ×1
bulkinsert ×1
etl ×1
fifo ×1
named-pipes ×1
odata ×1
powershell ×1
sql ×1
sqlclr ×1
text-files ×1