我在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
继我之前的问题之后,在这里使用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.
我有一些值得注意的值表:
| 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) 我在过去的8年里一直在使用SQL Server Management Studio(SSMS),而且我一直在遇到问题.当我右键单击一个表,然后选择SELECT TOP 2000 ROWS时,查询编辑器会打开一个包含查询的新文件.这很好,所有这些都是为了快速查看表格.
我遇到的问题是默认数据库从实际数据库更改为master数据库.我有sysadmin权限.
由SSMS生成的查询,然后在括号中包含数据库,模式和表,即[DB].[dbo].[TableName]
有没有办法在SELECT TOP 2000 ROWS命令上设置默认数据库,而不是去默认数据库设置为'master'?
另一种解决方法是单击表,然后执行"新查询",它将保留当前数据库,然后我必须输入'SELECT*FROM TableName'

我每次使用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
我目前有一个数据库表设置如下(EAV - 业务原因是有效的):
这允许我将混合值作为键/值对添加到我的数据库中.例如:
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或图像等.
我试图在两列之间用空格连续排列并得到一个排序错误:
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 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 Server中有这样的查询
Alter table inventory
Add totalitems as iteminstore + iteminwarehouse PERSISTED`
Run Code Online (Sandbox Code Playgroud)
写这个有persisted什么好处?
我有几种情况,我的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
sql-server-2012 ×10
sql-server ×5
sql ×4
c# ×2
sql-variant ×2
ssms ×2
collate ×1
concat ×1
performance ×1
varchar ×1