我正在运行 SQL Server 2012。
SQL Server Management Studio 可以选择右键单击数据库,然后选择任务和生成脚本。
有没有办法通过命令行以某种方式自动化?
我想创建一个包含整个数据库的架构和数据的脚本。
之类的工具ScriptDB,并sqlpubwiz.exe似乎都针对SQL Server 2005的什么有关SQL Server 2012?
出于故障排除目的,我希望能够检查客户端是否可以连接到 SQL Server 实例,而与可能无法连接到 SQL Server 的应用程序无关。
有没有一种简单的方法(也就是说,不必安装第 3 方软件)使用默认的 Windows 系统工具来做到这一点?也许使用脚本或网络应用程序?
免责声明:作为一个只使用数据库一小部分工作时间的人,请耐心等待。(大部分时间我在工作中进行 C++ 编程,但每个奇数月我都需要在 Oracle 数据库中搜索/修复/添加一些内容。)
我一再需要编写复杂的 SQL 查询,包括临时查询和内置于应用程序的查询,其中大部分查询只是重复“代码”。
用传统的编程语言编写这种可憎的东西会让你陷入困境,但我(我)还没有找到任何像样的技术来防止 SQL 查询代码重复。
编辑:第一,我要感谢对我的原始示例提供出色改进的回答者。但是,这个问题与我的示例无关。这是关于 SQL 查询中的重复性。因此,到目前为止的答案(JackP、Leigh)都很好地表明您可以通过编写更好的查询来减少重复性。然而,即便如此,您仍面临一些显然无法消除的重复性:这总是用 SQL 烦扰我。在“传统”编程语言中,我可以进行大量重构以最大程度地减少代码中的重复性,但是对于 SQL,似乎没有(?)工具可以实现这一点,除非开始编写重复性较低的语句。
请注意,我再次删除了 Oracle 标记,因为我真的很想知道是否没有允许更多内容的数据库或脚本语言。
这是我今天拼凑起来的一颗这样的宝石。它基本上报告了单个表的一组列中的差异。请浏览以下代码,尤其是。最后的大查询。下面我继续说。
--
-- Create Table to test queries
--
CREATE TABLE TEST_ATTRIBS (
id NUMBER PRIMARY KEY,
name VARCHAR2(300) UNIQUE,
attr1 VARCHAR2(2000),
attr2 VARCHAR2(2000),
attr3 INTEGER,
attr4 NUMBER,
attr5 VARCHAR2(2000)
);
--
-- insert some test data
--
insert into TEST_ATTRIBS values ( 1, 'Alfred', 'a', 'Foobar', …Run Code Online (Sandbox Code Playgroud) 我目前使用Visual Studio 专业版,它有数据库项目作为项目模板,但它的一些功能不可用,例如Schema Compare tool。架构比较和数据库更新脚本生成仅在Visual Studio 2010 Premium/Ultimate 版本中可用。
但是,Visual Studio 中的模式比较和更新脚本生成功能是否与Redgate SQL 比较工具中的功能一样丰富?(我也没有用过)我没能找到功能比较列表。任何人都使用过它们,可以帮助说清楚吗?
由于业务逻辑,我们需要在表中添加一个新列,以确保始终填充该列。因此,应将其添加到表中NOT NULL。与之前解释如何手动执行此操作的问题不同,这需要由 SSDT 发布管理。
由于一些认识,我一直在用头撞墙一段时间来完成这个听起来简单的任务:
我听别人说的方法是直接更新表定义(这样schema刷新是一致的),写一个预部署脚本,将表的全部内容移动到一个包含新列填充逻辑的临时表,然后移动后部署脚本中的行。尽管如此,这似乎很危险,并且当它检测到一个 NOT NULL 列被添加到一个包含现有数据的表中时仍然会激怒发布预览(因为验证在预部署脚本之前运行)。
我应该如何添加一个新的、不可为空的列,而不会冒孤立数据的风险,或者在每次发布时使用固有风险的冗长迁移脚本来回移动数据?
谢谢。
我必须重构并记录一些foo.sql查询,这些查询将由一个数据库技术支持团队共享(用于客户配置等)。有些类型的票会定期出现,每个客户都有自己的服务器和数据库,但除此之外,架构是完全相同的。
存储过程目前不是一个选项。我正在争论是使用动态还是 SQLCMD,我没有使用过太多,因为我对 SQL Server 有点陌生。
SQLCMD 脚本我觉得对我来说绝对“看起来”更干净,更容易阅读并根据需要对查询进行小的更改,但也会强制用户启用 SQLCMD 模式。由于使用字符串操作编写查询而导致语法突出显示丢失,因此动态更加困难。
这些正在使用 Management Studio 2012,SQL 版本 2008R2 进行编辑和运行。这两种方法的优缺点是什么,或者一种方法或另一种方法的一些 SQL Server“最佳实践”是什么?其中一个比另一个“更安全”吗?
declare @ServerName varchar(50) = 'REDACTED';
declare @DatabaseName varchar(50) = 'REDACTED';
declare @OrderIdsSeparatedByCommas varchar(max) = '597336, 595764, 594594';
declare @sql_OrderCheckQuery varchar(max) = ('
use {@DatabaseName};
select
-- stuff
from
{@ServerName}.{@DatabaseName}.[dbo].[client_orders]
as "Order"
inner join {@ServerName}.{@DatabaseName}.[dbo].[vendor_client_orders]
as "VendOrder" on "Order".o_id = "VendOrder".vco_oid
where "VendOrder".vco_oid in ({@OrderIdsSeparatedByCommas});
');
set @sql_OrderCheckQuery = replace( @sql_OrderCheckQuery, '{@ServerName}', quotename(@ServerName) );
set @sql_OrderCheckQuery = …Run Code Online (Sandbox Code Playgroud) Oracle SQL Developer 能够通过Tools -> Database Export...这种方式导出 DDL效果很好,但需要人工干预。
我知道DBMS_METADATA.get_ddl(),但发现导出并不完美。我遇到了导出的DBMS_METADATADDL 无法使用的问题,如果没有首先解决诸如关键字中间中断之类的问题,甚至更糟。但是,如果有人知道一种DMBS_METADATA无需手动修复即可运行的导出 DDL 的方法,那也将是一个很好的解决方案。
基本上,我正在寻找一种自动/脚本化的方式来导出与通过手动方式导出的 DDL相同的DDL 。
我怎样才能做到这一点?
有时我有一个 SQL 脚本,其中包含一个或多个超长(有时甚至是愚蠢的)字符串。通常这些是VARBINARY代表文件/程序集的文字/常量,但有时它们是文本。
真正长字符串的主要问题是一些文本编辑器不能很好地处理它们。例如,我VARBINARY在CREATE ASSEMBLY [AssemblyName] FROM 0x....语句中使用了一个文字,而程序集本身的大小刚好超过 1 MB,相当于文本文件中的字符超过 200 万个,因为每个字节需要两个字符以十六进制表示法表示(例如0x1F= a1和 an F)。SQL Server Management Studio (SSMS) 不能很好地处理这个问题,并在我尝试滚动该行时挂起几秒钟。事实上,某些版本(不确定这是否仍然发生)甚至会在打开至少有一行超过特定长度的脚本时显示关于长行的警告。
第二个问题是,在没有启用自动换行的编辑器中使用或在线发布时,它会使格式复杂化。这里的问题是水平滚动条的滑块非常窄,即使稍微移动它,通常也会将非超长文本滚动到视野之外。
现在,T-SQL 不会用换行符甚至分号终止命令(尽管从 SQL Server 2005 开始,分号是首选/推荐的)。因此,由于 SQL Server 知道如何解析每个语句,从而知道它何时结束,似乎将长行拆分为多行,仅由newline/ carriage-return+分隔line-feed,这似乎并不合理。但这在任何一种情况下都不起作用。
PRINT 'Line1
Line2';
Run Code Online (Sandbox Code Playgroud)
返回(在“消息”选项卡中):
Line1
Line2
Run Code Online (Sandbox Code Playgroud)
这很有意义,因为换行符在文字/常量内。但是对 a 执行此操作VARBINARY也不起作用。
PRINT 0x1234
5678;
Run Code Online (Sandbox Code Playgroud)
给我一个错误。
如何修改带有索引的表的类型?我试图在一个空表上做一个改变列来修改从日期时间到 varchar(15) 的类型,并得到错误说它依赖于列(结果是索引)。
通过右键单击索引并编写 drop 脚本,我能够在本地轻松解决此问题,但是我需要在无法访问索引名称的其他服务器上推出此功能。
有没有办法制作一个可以删除任何索引的脚本,让我在列上更改数据类型然后读取索引?谢谢!
是否可以编写包含 SQLite 点命令( vis. .read file.sql; .separator ,; .import file.csv;)的脚本?
我正在构建并反复重建 SQLite 数据库,每次重建数据库时都需要输入大约 24 个点命令语句。如果我可以将这些命令放在脚本中并让 SQLite 读取它们,那就太好了。
有没有办法将点命令(而不是SQL 语句)放入脚本并让 SQLite 运行它们?
我在 Mac OS X 上使用 bash。
scripting ×10
sql-server ×6
dynamic-sql ×2
alter-table ×1
constraint ×1
ddl ×1
export ×1
null ×1
oracle ×1
query ×1
schema ×1
sqlcmd ×1
sqlite ×1
ssdt ×1
ssms ×1
t-sql ×1
tools ×1