小编Sol*_*zky的帖子

表值参数性能的问题

我不知道这是否是我使用它们或Microsoft的实现的问题,但SQL 2008表值参数非常缓慢.

一般来说,如果我需要使用TVP,那是因为我有很多记录 - 目前它们似乎比最少的记录速度慢得多.

我在.Net中调用它们是这样的:

// get the data
DataTable data = GetData();

com.CommandText = "sprocName"

// create the table-value parameter
var tvp = com.Parameters.AddWithValue("data", data);
tvp.SqlDbType = SqlDbType.Structured;

com.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

我运行探查器来查看原因,实际的SQL语句是这样的:

declare @data table ...

insert into @data ( ... fields ... ) values ( ... values ... )
-- for each row
insert into @data ( ... fields ... ) values ( ... values ... )

sprocName(@data)
Run Code Online (Sandbox Code Playgroud)

尽管如此,这是一个非常缓慢的方法.如果这样做会更快:

insert into @data ( ... fields ... ) 
values ( …
Run Code Online (Sandbox Code Playgroud)

.net sql-server performance sql-server-2008 table-valued-parameters

13
推荐指数
2
解决办法
5208
查看次数

SQL Server中用户定义的表类型的性能

我们一直在使用用户定义的表类型将整数列表传递给我们的存储过程.

然后我们使用它们连接到存储过程查询中的其他表.

例如:

CREATE PROCEDURE [dbo].[sp_Name]
(
    @Ids [dbo].[OurTableType] READONLY  
)
AS
    SET Nocount ON

    SELECT
        *
    FROM
        SOMETABLE
        INNER JOIN @Ids [OurTableType] ON [OurTableType].Id = SOMETABLE.Id
Run Code Online (Sandbox Code Playgroud)

在使用更大的数据集时,我们发现这方面的表现很差.

我们用来加快速度的一种方法是将内容转储到临时表中,然后将其加入.

例如:

CREATE PROCEDURE [dbo].[sp_Name]
(
    @Ids [dbo].[OurTableType] READONLY  
)
AS
    SET Nocount ON
    CREATE TABLE #TempTable(Id INT)
    INSERT INTO #TempTable
    SELECT Id from @Ids

    SELECT
        *
    FROM
        SOMETABLE
        INNER JOIN #TempTable ON #TempTable.Id = SOMETABLE.Id

    DROP TABLE #TempTable
Run Code Online (Sandbox Code Playgroud)

这确实显着提高了性能,但我希望对这种方法以及我们未考虑的任何其他后果有所了解.关于为什么这改善性能的解释也可能是有用的.

NB有时我们可能需要传递的不仅仅是一个整数,因此我们不使用逗号分隔列表或类似的东西.

t-sql sql-server user-defined-types table-valued-parameters sql-server-2008-r2

13
推荐指数
1
解决办法
1万
查看次数

如何为具有VARBINARY(MAX)字段的表生成INSERT脚本?

我有一个VARBINARY(MAX)字段的表(SQL Server 2008 FILESTREAM)

我的要求是,当我去部署到生产时,我只能为我的IT团队提供一组SQL脚本,以便按特定顺序执行.我正在制作的新表有这个VARBINARY(MAX)领域.通常使用新表,我会编写CREATE TABLE脚本脚本.而且,如果我有数据,我需要使用它,然后我将编写INSERT脚本脚本.不太复杂.

但是VARBINARY(MAX),我用来生成INSERT语句的存储过程在该表上失败了.我尝试选择该字段,打印,复制,转换为十六进制等.我遇到的主要问题是它没有选择字段中的所有数据.我做了一个检查DATALENGTH([FileColumn]),如果源行包含1,004,382字节,那么当我再次插入时,我可以获得复制或选择的数据的最大值是8000.所以基本上它是截断的(即无效的)数据.....

我怎么能做得更好?我试着像疯了一样搜索谷歌但我必须遗漏一些东西.请记住,我无法访问文件系统.这必须全部编写脚本.

t-sql sql-server varbinary sql-server-2008 sqlfilestream

12
推荐指数
2
解决办法
7389
查看次数

nvarchar concatenation/index/nvarchar(max)莫名其妙的行为

我今天在SQL Server(2008R2和2012)中遇到了一个非常奇怪的问题.我正在尝试使用串联和select语句来构建字符串.

我找到了解决方法,但我真的很想了解这里发生了什么以及为什么它没有给我预期的结果.有人可以向我解释一下吗?

http://sqlfiddle.com/#!6/7438a/1

根据要求,这里的代码也是:

-- base table
create table bla (
    [id] int identity(1,1) primary key,
    [priority] int,
    [msg] nvarchar(max),
    [autofix] bit
)

-- table without primary key on id column
create table bla2 (
    [id] int identity(1,1),
    [priority] int,
    [msg] nvarchar(max),
    [autofix] bit
)

-- table with nvarchar(1000) instead of max
create table bla3 (
    [id] int identity(1,1) primary key,
    [priority] int,
    [msg] nvarchar(1000),
    [autofix] bit
)

-- fill the three tables with the same values …
Run Code Online (Sandbox Code Playgroud)

sql-server nvarchar string-concatenation sql-server-2012

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

SQL Server 2008:如何将输出格式化为货币

我有一个查询字符串,它返回一个有几个小数位的值.我想将其格式化为123.45美元.

这是查询:

SELECT COALESCE(SUM(SUBTOTAL),0) 
FROM dbo.SALESORD_HDR 
where ORDERDATE = datediff(d,0,getdate()) 
and STATUS NOT IN (3,6)
Run Code Online (Sandbox Code Playgroud)

我希望结果以2位小数的货币.

t-sql sql-server formatting casting localization

12
推荐指数
2
解决办法
6万
查看次数

freebcp:"Unicode数据是列的奇数字节大小.应该是偶数字节大小"

这个文件工作正常(UTF-8):

$ cat ok.txt
291054  ?aw? Rif?
Run Code Online (Sandbox Code Playgroud)

此文件导致错误(UTF-8):

$ cat bad.txt
291054  ?aw? Rif?‘
Run Code Online (Sandbox Code Playgroud)

这是消息:

$ freebcp 'DB.dbo.table' in bad.txt ... -c
Starting copy...
Msg 20050, Level 4
Attempt to convert data stopped by syntax error in source field

Msg 4895, Level 16, State 2
Server '...', Line 1
    Unicode data is odd byte size for column 2. Should be even byte size.
Msg 20018, Level 16
General SQL Server error: Check messages from the SQL Server
Run Code Online (Sandbox Code Playgroud)

唯一的区别是最后一个字符,即unicode 2018(左单引号)

知道是什么导致了这个错误吗? …

sql-server unicode character-encoding freetds sql-server-2012

12
推荐指数
2
解决办法
1734
查看次数

SQL Server 中的 regexp_replace 等效项是什么

我在 Oracle 中有这段代码,我需要将其转换为 SQL Server 以获得相同的行为。我已经使用过该REPLACE功能。它似乎有效,但我只是想确定一下。

REGEXP_REPLACE(
                phonenumber, 
               '([[:digit:]]{3})([[:digit:]]{3})([[:digit:]]{4})', 
               '(\1)\2-\3'
               ) phonenumber
Run Code Online (Sandbox Code Playgroud)

regex sql-server oracle

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

Azure SQL Edge 不支持指定的选项“已启用 clr”

我是一名 .NET 开发人员,也是 mac (m1 pro) 的新手。我使用 docker 并提取azure-sql-edge映像。当我尝试创建包含列的表或在代码优先解决方案生成的类型列geometry中插入值时,遇到以下错误:geometry

此实例上未启用公共语言运行时 (CLR)。

我尝试通过运行启用 CLR exec sp_configure 'clr enabled',1,但遇到以下错误:

此版本的 SQL Server 不支持指定的选项“clrenabled”,并且无法使用 sp_configure 进行更改。

该怎么办?请帮我。

sql-server macos sqlclr apple-m1 azure-sql-edge

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

为什么是SQL Server Big Endian?

根据我的阅读,所有Windows版本和.NET都是小端.那么为什么偏离微软的SQL Server规范呢?

我的意思是"SQL Server是大端"是这样的:

SELECT CONVERT(VARBINARY, 255);
Run Code Online (Sandbox Code Playgroud)

得到:

0x000000FF
Run Code Online (Sandbox Code Playgroud)

并不是

0xFF000000
Run Code Online (Sandbox Code Playgroud)

类似于.NET的BitConverter.GetBytes()方式.我猜SQL Server可以在内部存储数字作为小端,然后CONVERT由于某种原因只是将其切换.但不管怎样,为什么?

编辑:

刚注意到这个......

DECLARE @q UNIQUEIDENTIFIER = '01234567-89ab-cdef-0123-456789abcdef';
SELECT @q;
SELECT CONVERT(VARBINARY, @q);
Run Code Online (Sandbox Code Playgroud)

给我:

01234567-89AB-CDEF-0123-456789ABCDEF

0x67452301AB89EFCD0123456789ABCDEF
Run Code Online (Sandbox Code Playgroud)

有没有搞错?

sql-server endianness

11
推荐指数
1
解决办法
3266
查看次数

SQLCMD模式下的ServerConnection.ExecuteNonQuery

我正在使用Microsoft Data-Tier Application框架来创建基于DacPackage对象的部署脚本.我试图使用Microsoft.SqlServer.Management.Smo.Server类来执行此脚本...

SqlConnection deployConnection = new SqlConnection(connBuilder.ToString());
deployConnection.Open();
Server server = new Server(new ServerConnection(deployConnection));
server.ConnectionContext.ExecuteNonQuery(deployScript);
Run Code Online (Sandbox Code Playgroud)

然而,这错误...

Unhandled Exception: Microsoft.SqlServer.Management.Common.ExecutionFailureException:
  An exception occurred while executing a Transact-SQL statement or batch. --->
  System.Data.SqlClient.SqlException: Incorrect syntax near ':'.
Run Code Online (Sandbox Code Playgroud)

我知道这个问题的答案是我需要处于SQLCMD模式,但我不知道如何告诉我的ServerConnection在所述模式下执行.

我想我的问题不像我在标题中说的那样具体.我真正需要做的是通过.Net框架执行从DacPackage生成的脚本.谁能帮我这个?

c# sql-server sqlcmd data-tier-applications sql-server-data-tools

11
推荐指数
1
解决办法
7427
查看次数