标签: sql-server-2012

在sql_variant列的表值参数中传递'object'类型的参数

我在SQL Server 2012中有一个表值参数定义为:

CREATE TYPE [dbo].[TVP] AS TABLE (
    [Id] [int] NOT NULL,
    [FieldName] [nvarchar](100) NOT NULL,
    [Value] [sql_variant] NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

我在C#中使用代码看起来大致如下所示:

var mdItems = new DataTable();
mdItems.Columns.Add("Id", typeof(int));
mdItems.Columns.Add("FieldName", typeof(string));
mdItems.Columns.Add("Value", typeof(object));
mdItems.Rows.Add(new object[] {2, "blah", "value"}); //'value' is usually a string
SqlCommand sqlCommand = conn.CreateCommand();
sqlCommand.CommandText = "[WriteFieldValues]";
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.Parameters.AddWithValue("@FieldValues", mdItems);
sqlCommand.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

然后,我在ExecuteNonQuery调用SQL Server时收到以下错误:

不支持"值"列的类型.类型是'对象'

我发现有人在3年前遇到了同样的问题,当时它被认定为已知的Microsoft bug.但是,该错误的链接已被破坏.有谁知道是否有关于错误状态或潜在解决方法的最新信息?就目前而言,这个错误确实会破坏sql_variant字段的价值.

c# sql-server sql-variant table-valued-parameters sql-server-2012

15
推荐指数
2
解决办法
3519
查看次数

带有多列和Desc/Asc排序的子句的CASE语句

继我之前的问题之后,在这里使用Desc/Asc排序的Order By子句的Case语句我有这样的声明:

SELECT 
    *
FROM
    TableName
WHERE
ORDER BY 
    CASE @OrderByColumn WHEN 1 THEN Forename END DESC, 
    CASE @OrderByColumn WHEN 2 THEN Surname END ASC 
Run Code Online (Sandbox Code Playgroud)

这很好用,但有时我需要的不仅仅是列中的列.我实际上需要这样的东西:

.....
ORDER BY
    CASE @OrderByColumn WHEN 1 THEN Forename, Date, Location END DESC
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何使CASE语句允许部件中的多个列THEN.

sql sql-server-2012

15
推荐指数
2
解决办法
3万
查看次数

如何选择行和附近的行

SQL小提琴

背景

我有一些值得注意的值表:

| ID      | AddedDate   |
|---------|-------------|
|       1 | 2010-04-01  |
|       2 | 2010-04-01  |
|       3 | 2010-04-02  |
|       4 | 2010-04-02  |
|       5 | NULL        | <----------- needs attention
|       6 | 2010-04-02  |
|       7 | 2010-04-03  |
|       8 | 2010-04-04  |
|       9 | 2010-04-04  |
| 2432659 | 2016-06-15  |
| 2432650 | 2016-06-16  |
| 2432651 | 2016-06-17  |
| 2432672 | 2016-06-18  |
| 2432673 | …
Run Code Online (Sandbox Code Playgroud)

sql sql-server sql-server-2012

15
推荐指数
1
解决办法
1110
查看次数

查询时的SQL Server默认数据库 - 主数据库

我在过去的8年里一直在使用SQL Server Management Studio(SSMS),而且我一直在遇到问题.当我右键单击一个表,然后选择SELECT TOP 2000 ROWS时,查询编辑器会打开一个包含查询的新文件.这很好,所有这些都是为了快速查看表格.

我遇到的问题是默认数据库从实际数据库更改为master数据库.我有sysadmin权限.

由SSMS生成的查询,然后在括号中包含数据库,模式和表,即[DB].[dbo].[TableName]

有没有办法在SELECT TOP 2000 ROWS命令上设置默认数据库,而不是去默认数据库设置为'master'?

另一种解决方法是单击表,然后执行"新查询",它将保留当前数据库,然后我必须输入'SELECT*FROM TableName'

默认数据库已更改为master

ssms sql-server-2008-r2 sql-server-2012

14
推荐指数
1
解决办法
7318
查看次数

打开或创建数据库关系图后,SQL Server Management Studio崩溃

我每次使用SQL Server 2012 Management Studio打开或创建新的数据库关系图时都会出现错误消息,然后自动重新启动SSMS.

错误消息是

尝试读取或写入受保护的内存.这通常表明其他内存已损坏.(Microsoft.VisualStudio.OLE.Interop)

以下是我为解决此问题所做的工作:

早些时候,我安装了SQL Server 2008:通过下载Visual Basic Express 2010时可用的选项.还没有错误.我可以毫无问题地创建和编辑数据库图表.然后我卸载了VB Express 2010,并安装了Visual Studio 2012,但发现它是试用版,我不喜欢,所以我卸载了Visual Studio 2012.我启动了SSMS 2008并试图打开数据库图表我的一个数据库.我收到一个错误说

无法找到指定的模块.(MS Visual Database Tools)

我使用Management Studio安装了SQL Server 2012,然后使用SSMS 2012尝试打开数据库图表.而不是Specified module错误,我得到了关于尝试读取或写入受保护的内存的错误.

我正在运行Windows 7,SQL Server 2012 Express,我没有卸载SQL Sever 2008 Express(尚未),Visual C#2010 Express,Visual Basic 2010 Express.

编辑:我试图通过应用名为SQLServer2012_RTM_CU1_kb2679368_11_0_2316_x64的修补程序来解决此问题.它并没有解决问题.此链接的MSDN论坛中的用户建议使用此修补程序:http://social.msdn.microsoft.com/Forums/en/sqlexpress/thread/1753d7ba-f6ec-4a8e-a1c9-ded2a5b7c607

sql-server ssms visual-studio sql-server-2012

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

在SQL Server中使用sql_variant而不是varchar有什么好处吗?

我目前有一个数据库表设置如下(EAV - 业务原因是有效的):

  • Id - int(PK)
  • 钥匙 - 独特,varchar(15)
  • 价值 - varchar(1000)

这允许我将混合值作为键/值对添加到我的数据库中.例如:

1   | 'Some Text'      | 'Hello World'
2   | 'Some Number'    | '123456'
etc.
Run Code Online (Sandbox Code Playgroud)

在我的C#代码,我用ADO.Net使用reader.GetString(2);检索值作为一个字符串,然后让我的代码的其他地方将其转换为所需,例如... Int32.ParseInt(myObj.Value);.我正在考虑通过将value列更改为sql_variant数据类型来增强我的表,但我不知道这会带来什么好处?基本上,它有什么优势将我的价值列是sql_variantVS varchar(1000)


为了更清楚,我在某处读到sql_variant以nvarchar(4000)的形式返回给调用的客户端(ouch)!但是,在返回它之前,我不能把它转换成它的类型吗?显然,我的代码必须进行调整,以将值存储为对象而不是字符串值.我想,sql_variant在我目前的情况下使用与其他类型相比有哪些优点/缺点?哦,值得一提的是我计划存储的所有内容都是值列中的日期时间,字符串和数字类型(int,decimal等); 我不计划存储和blob或图像等.

c# performance varchar sql-variant sql-server-2012

14
推荐指数
2
解决办法
8431
查看次数

在CONCAT中使用Collat​​e

我试图在两列之间用空格连续排列并得到一个排序错误:

SELECT DISTINCT
    p.PERSON_ID,
    p.ID_NUMBER,
    CONCAT(p.FULLNAMES, CONCAT(' ', p.SURNAME)) AS NAME,
    o.ORG_NAME,
    w.WARD_DESCRIPTION AS WARD,
    ess.DESCRIPTION AS SECTOR
Run Code Online (Sandbox Code Playgroud)

在concat操作中无法解决"SQL_Latin1_General_CP1_CI_AS"和"Latin1_General_CI_AS"之间的排序规则冲突

我的数据库中两个违规列的排序规则是: Latin1_General_CI_AS

所以我试图将空白整理到这个整理,但我不知道如何做到这一点.我的尝试:

CONCAT(p.FULLNAMES, (CONCAT((COLLATE Latin1_General_CI_AS = ' '), p.SURNAME))) AS NAME,
Run Code Online (Sandbox Code Playgroud)

或者其他的东西?

sql-server concat collate sql-server-2012

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

SQL Server:连接多个列的最佳方法?

我试图连接SQL Server 11.00.3393中的查询中的多个列.

我尝试了新功能,CONCAT()但是当我使用两列以上时它不起作用.

所以我想知道这是解决问题的最佳方法:

SELECT CONCAT(CONCAT(CONCAT(COLUMN1,COLUMN2),COLUMN3),COLUMN4) FROM myTable
Run Code Online (Sandbox Code Playgroud)

我不能COLUMN1 + COLUMN2因为NULL价值观而使用.

编辑

如果我尝试SELECT CONCAT('1','2','3') AS RESULT我得到一个错误

CONCAT函数需要2个参数

sql sql-server-2012

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

SQL Server 2012中的持久性意味着什么

我在SQL Server中有这样的查询

Alter table inventory
Add totalitems  as iteminstore + iteminwarehouse PERSISTED`
Run Code Online (Sandbox Code Playgroud)

写这个有persisted什么好处?

sql-server-2012

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

为什么在某些情况下CTE(公用表表达式)与SQL Server中的临时表相比会减慢查询速度

我有几种情况,我的complex CTE(Common Table Expressions)比使用临时表的相同查询慢十倍SQL Server.

我的问题是关于如何SQL Server处理CTE查询,看起来它试图加入所有分离的查询,而不是存储每个查询的结果,然后尝试运行以下查询.因此,这可能是使用临时表时速度更快的原因.

例如:

查询1:使用Common Table Expression:

;WITH Orders AS
(
    SELECT
        ma.MasterAccountId,
        IIF(r.FinalisedDate IS NULL, 1, 0)) [Status]
    FROM 
        MasterAccount ma
    INNER JOIN 
        task.tblAccounts a ON a.AccountNumber = ma.TaskAccountId 
                           AND a.IsActive = 1
    LEFT OUTER JOIN 
        task.tblRequisitions r ON r.AccountNumber = a.AccountNumber 
    WHERE 
        ma.IsActive = 1
        AND CAST(r.BatchDateTime AS DATE) BETWEEN @fromDate AND @toDate
        AND r.BatchNumber > 0
),
StockAvailability AS
(
    SELECT …
Run Code Online (Sandbox Code Playgroud)

sql sql-server sql-server-2005 sql-server-2008 sql-server-2012

14
推荐指数
2
解决办法
1599
查看次数