小编Pet*_*hia的帖子

是否可以在SQL CLR用户定义类型中创建表值*方法*?

我有一个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)

sql-server sqlclr user-defined-types sql-server-2008

12
推荐指数
1
解决办法
1307
查看次数

在Powershell中,按记录类型拆分大型文本文件的最有效方法是什么?

我正在使用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,但这是另一个问题!

powershell etl text-files

9
推荐指数
1
解决办法
5696
查看次数

提高WCF数据服务中.NET客户端数据上下文性能的技巧?

我们一直在使用以下堆栈开发一个新的应用程序:

SQL Server 2008 R2 - >实体框架4.2 - > WCF数据服务 - > WCF数据服务客户端库

这都是.NET 4.0

现在,WCF数据服务客户端库非常便于小数据和简单的模式/对象图,但它对于更复杂的模型来说是一个真正的好处.特别是,我们发现DataServiceContext.Links集合可以扩展O(n ^ 2):你加载的对象越多,你的图表嵌套越多,它就越慢,直到加载数据需要更长的时间进入上下文比它从线上读取它.

例如,我们有一个拥有2000个成员的集合,每个成员有4个导航属性.在不扩展任何导航属性的情况下拉动整个集合大约需要1秒钟.扩展所有4个导航属性需要5秒.我们测量了堆栈中各个点的性能,并且大部分额外时间花在客户端上,整理数据.

我们采用了各种技术来解决大数据集:

  1. 非规范化.这适用于我们始终扩展的图形.如果我们想延迟加载图形的一部分,那么效果不好.
  2. 分别加载相关对象,并在数据上下文之外将它们拼接在一起.这只是烦人的,但它确实克服了context.Links问题.
  3. 使用多个数据上下文将Links集合的压力降至最低.
  4. 连接中使用MergeOption.NoTracking w /(1)&(2)

有谁知道其他任何技术?在加载相关对象时,是否存在可能导致不必要开销的设置?

有时看起来我们正在编写自己的自定义上下文的一半,我想在它变得更精细之前进行健全性检查.

[是的,我意识到WCF数据服务可能是错误的工具.唉,我们已经走了这条路]

wcf-data-services odata wcf-data-services-client

8
推荐指数
0
解决办法
1108
查看次数

可以从命名管道/ fifo读取Sql Server BULK INSERT吗?

BULK INSERT/bcp是否可以从命名管道读取,fifo- style?

也就是说,不是从实际文本文件中读取,而是可以使BULK INSERT/bcp从另一个进程的写入端的命名管道读取?

例如:

  1. 创建命名管道
  2. 将文件解压缩到命名管道
  3. 使用bcp或BULK INSERT从命名管道读取

要么:

  1. 创建4个命名管道
  2. 将1个文件拆分为4个流,将每个流写入单独的命名管道
  3. 从4个命名管道读取4个表w/bcp或BULK INSERT

我发现的最接近的是这个家伙(网站现在无法访问),谁管理,编写命名管道瓦特/ 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)

然后什么?

sql-server bulkinsert bcp named-pipes fifo

7
推荐指数
3
解决办法
3676
查看次数

读取表变量的查询是否可以在SQL Server 2008中生成并行执行计划?

首先,来自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

4
推荐指数
2
解决办法
2436
查看次数