如果我在Microsoft SQL Server中向表中添加列,是否可以在查询中以逻辑方式控制列的显示位置?
我不想搞乱磁盘上列的物理布局,但我希望在可能的情况下逻辑地将列组合在一起,以便SQL Server Management Studio等工具以方便的方式列出表的内容.
我知道我可以通过SQL Management Studio执行此操作,进入表的"设计"模式并拖动列的顺序,但我希望能够在原始SQL中执行此操作,以便我可以执行排序从命令行编写脚本.
有没有办法从数据库中获取所有表,过程和其他对象的脚本?我知道有一个脚本数据库的选项,但它只给了我某种顶级脚本,当然不是创建所有表,procs,udfs,.etc的脚本.
我已经在MSDN论坛和这里读到了这个,我还不清楚.我认为这是正确的:Varchar(max)将存储为文本数据类型,因此存在缺陷.因此,假设您的字段可靠地低于8000个字符.像我的数据库表中的BusinessName字段.实际上,商业名称可能总是在(从我的帽子里拿出一个数字)500个字符.看起来我运行的大量varchar字段远低于8k字符数.
那么我应该将该字段设为varchar(500)而不是varchar(8000)吗?根据我对SQL的理解,这两者之间没有区别.因此,为了简化生活,我想将所有varchar字段定义为varchar(8000).这有什么缺点吗?
相关:varchar列的大小(我不觉得这个回答了我的问题).
我将设计一个DW,我听说了物化视图.实际上我想创建一个视图,它应该在更改基表时自动更新.任何人都可以用查询示例解释..
在不同服务器上的两个不同数据库中有两个表,我需要加入它们以便进行少量查询.我有什么选择?我该怎么办?
在尝试提高极慢查询的速度时(在两个表上只有几万分钟,在SQL Server 2008上只有几万行,如果重要的话),我将问题缩小到OR我的内连接中,如:
SELECT mt.ID, mt.ParentID, ot.MasterID
FROM dbo.MainTable AS mt
INNER JOIN dbo.OtherTable AS ot ON ot.ParentID = mt.ID
OR ot.ID = mt.ParentID
Run Code Online (Sandbox Code Playgroud)
我把它更改为(我希望是)一对等效的左连接,如下所示:
SELECT mt.ID, mt.ParentID,
CASE WHEN ot1.MasterID IS NOT NULL THEN
ot1.MasterID ELSE
ot2.MasterID END AS MasterID
FROM dbo.MainTable AS mt
LEFT JOIN dbo.OtherTable AS ot1 ON ot1.ParentID = mt.ID
LEFT JOIN dbo.OtherTable AS ot2 ON ot2.ID = mt.ParentID
WHERE ot1.MasterID IS NOT NULL OR ot2.MasterID IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
..现在查询运行大约一秒钟!
OR加入条件通常是个坏主意吗?或者我在桌子的布局中不知何故不幸?
我正在生成一个脚本,用于自动将更改从多个开发数据库迁移到暂存/生产.基本上,它需要一堆更改脚本,并将它们合并到一个脚本中,将每个脚本包装在一个IF whatever BEGIN ... END语句中.
但是,某些脚本需要一个GO语句,以便例如SQL解析器在创建新列后知道它.
ALTER TABLE dbo.EMPLOYEE
ADD COLUMN EMP_IS_ADMIN BIT NOT NULL
GO -- Necessary, or next line will generate "Unknown column: EMP_IS_ADMIN"
UPDATE dbo.EMPLOYEE SET EMP_IS_ADMIN = whatever
Run Code Online (Sandbox Code Playgroud)
但是,一旦我将其包装在一个IF块中:
IF whatever
BEGIN
ALTER TABLE dbo.EMPLOYEE ADD COLUMN EMP_IS_ADMIN BIT NOT NULL
GO
UPDATE dbo.EMPLOYEE SET EMP_IS_ADMIN = whatever
END
Run Code Online (Sandbox Code Playgroud)
它失败了,因为我发送了一个BEGIN没有匹配的END.但是,如果我删除GO它,它会再次抱怨一个未知的列.
有没有办法在单个IF块中创建和更新同一列?
我正在尝试对链接服务器运行SQL,但我得到了错误.
BEGIN DISTRIBUTED TRANSACTION
SELECT TOP 1 * FROM Sessions
OLE DB provider "SQLNCLI" for linked server "ASILIVE" returned message "No transaction is active.".
Msg 7391, Level 16, State 2, Line 3
The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "ASILIVE" was unable to begin a distributed transaction.
Run Code Online (Sandbox Code Playgroud)
提供程序返回了两个错误:
错误#1:
Number: $80040E14
Source: Microsoft OLE DB Provider for SQL Server
Description: OLE DB provider "SQLNCLI" for linked server "ASILIVE" returned message "No transaction is …Run Code Online (Sandbox Code Playgroud) 我尝试恢复数据库,但此消息显示.如何恢复此数据库?
恢复数据库'farhangi_db'失败.
(Microsoft.SqlServer.Management.RelationalEngineTasks)
------------------------------附加信息:System.Data.SqlClient.SqlError:无法执行BACKUP LOG,因为
没有当前的数据库备份.(Microsoft.SqlServer.SmoExtended)
使用异步调用时,我遇到了严重的SQL性能问题.我创建了一个小案例来证明这个问题.
我在SQL Server 2016上创建了一个数据库,它驻留在我们的LAN中(因此不是localDB).
在该数据库中,我有一个WorkingCopy包含2列的表:
Id (nvarchar(255, PK))
Value (nvarchar(max))
Run Code Online (Sandbox Code Playgroud)
DDL
CREATE TABLE [dbo].[Workingcopy]
(
[Id] [nvarchar](255) NOT NULL,
[Value] [nvarchar](max) NULL,
CONSTRAINT [PK_Workingcopy]
PRIMARY KEY CLUSTERED ([Id] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
在该表中,我插入了一条记录(id='PerfUnitTest',Value是一个1.5mb的字符串(一个较大的JSON数据集的zip)).
现在,如果我在SSMS中执行查询:
SELECT [Value]
FROM [Workingcopy]
WHERE id = 'perfunittest'
Run Code Online (Sandbox Code Playgroud)
我立即得到结果,我在SQL Servre Profiler中看到执行时间大约是20毫秒.一切正常.
使用plain从.NET(4.6)代码执行查询时SqlConnection:
// at this point, the connection …Run Code Online (Sandbox Code Playgroud) sql-server ×10
sql ×5
t-sql ×3
.net ×1
async-await ×1
asynchronous ×1
c# ×1
database ×1
inner-join ×1
msdtc ×1