数据类型的nodes()
方法是否按xml
文档顺序返回节点?
例如,如果有以下数据:
declare @xml xml
set @xml = '<Fruits><Apple /><Banana /><Orange /><Pear /></Fruits>'
Run Code Online (Sandbox Code Playgroud)
被查询为
select T.c.query('.')
from @xml.nodes('/Fruits/*') T(c)
Run Code Online (Sandbox Code Playgroud)
元素将按文档顺序返回吗?select
如果order by
省略了子句,则返回的行的顺序是未定义的.是这样的select ... from ... .nodes()
,还是特殊的?
在某些情况下,是否可以在以下查询的输出中获取非空行集:
declare @xml xml
set @xml = '<Data><Element OrderNo="1" /><Element OrderNo="2" />'
+ '<Element OrderNo="3" /><Element OrderNo="4" />'
+ '<Element OrderNo="5" /></Data>'
select * from (
select T.c.value('.', 'int') OrderNo1,
row_number() over (order by @@spid) OrderNo2
from @xml.nodes('/Data/Element/@OrderNo') T(c)) sq
where OrderNo1 != OrderNo2
Run Code Online (Sandbox Code Playgroud) 根据最近的问题.
有人能指出我对以下内容的解释吗?
如果我将binary(4)
常量转换0x80000000
为int
,取得结果值并将其转换为bit
类型,结果为1.
select cast(0x80000000 as int) --> -2147483648
select cast(-2147483648 as bit) --> 1
Run Code Online (Sandbox Code Playgroud)
但是如果我0x80000000
直接转换为位类型,结果为0.
select cast(0x80000000 as bit) --> 0
Run Code Online (Sandbox Code Playgroud)
我希望在这种情况下得到1,认为可能这个表达相当于
select cast(cast(0x80000000 as binary(1)) as bit)
Run Code Online (Sandbox Code Playgroud)
但这种情况并非如此.相反,似乎采用二进制常量的最高字节并将其转换为位.所以,有效的是它
select cast(cast(right(0x80000000, 1) as binary(1)) as bit)
Run Code Online (Sandbox Code Playgroud)
我很清楚第一binary -> int -> bit
部分.我不清楚的是第二binary -> bit
部分.我无法在文档中找到此行为,仅在此处
转换为位会将任何非零值提升为1.
说明.
如果需要以流式方式从SqlServer 读取数据,可以使用一些功能来实现。例如使用SqlDataReader
with CommandBehavior.SequentialAccess
,特别是当需要访问二进制列数据时,有以下方法GetStream(int)
:
var cmd = new SqlCommand();
cmd.Connection = connection;
cmd.CommandText = @"select 0x0123456789 as Data";
using (var dr = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
{
dr.Read();
var stream = dr.GetStream(0);
// access stream
}
Run Code Online (Sandbox Code Playgroud)
但是,当需要使用向SqlServer 提供数据时SqlBulkCopy
,特别是需要将流作为二进制列的数据源提供时,如何以相反的方向流式传输数据呢?
我尝试跟随
var cmd2 = new SqlCommand();
cmd2.Connection = connection;
cmd2.CommandText = @"create table #Test (ID int, Data varbinary(max))";
cmd2.ExecuteNonQuery();
using (SqlBulkCopy sbc = new SqlBulkCopy(connection, SqlBulkCopyOptions.TableLock, null))
{
sbc.DestinationTableName = "#Test";
sbc.EnableStreaming = true;
sbc.ColumnMappings.Add(0, "ID"); …
Run Code Online (Sandbox Code Playgroud)