标签: scripting

SQL Server 2012:从命令行生成脚本

我正在运行 SQL Server 2012。

SQL Server Management Studio 可以选择右键单击数据库,然后选择任务和生成脚本。

有没有办法通过命令行以某种方式自动化?

我想创建一个包含整个数据库的架构和数据的脚本。

之类的工具ScriptDB,并sqlpubwiz.exe似乎都针对SQL Server 2005的什么有关SQL Server 2012?

sql-server scripting

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

从客户端检查到 SQL Server 的连接的简单方法

出于故障排除目的,我希望能够检查客户端是否可以连接到 SQL Server 实例,而与可能无法连接到 SQL Server 的应用程序无关。

有没有一种简单的方法(也就是说,不必安装第 3 方软件)使用默认的 Windows 系统工具来做到这一点?也许使用脚本或网络应用程序?

sql-server scripting

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

连接字符串或程序化以防止 SQL 查询代码重复的替代方法?

免责声明:作为一个只使用数据库一小部分工作时间的人,请耐心等待。(大部分时间我在工作中进行 C++ 编程,但每个奇数月我都需要在 Oracle 数据库中搜索/修复/添加一些内容。)

我一再需要编写复杂的 SQL 查询,包括临时查询和内置于应用程序的查询,其中大部分查询只是重复“代码”。

用传统的编程语言编写这种可憎的东西会让你陷入困境,但我()还没有找到任何像样的技术来防止 SQL 查询代码重复。


编辑:第一,我要感谢对我的原始示例提供出色改进的回答者。但是,这个问题与我的示例无关。这是关于 SQL 查询中的重复性。因此,到目前为止的答案(JackPLeigh)都很好地表明您可以通过编写更好的查询来减少重复性。然而,即便如此,您仍面临一些显然无法消除的重复性:这总是用 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)

query scripting dynamic-sql

19
推荐指数
2
解决办法
2142
查看次数

Redgate SQL 与 Visual Studio 2010 Premium/Ultimate 数据库项目的比较

我目前使用Visual Studio 专业版,它有数据库项目作为项目模板,但它的一些功能不可用,例如Schema Compare tool。架构比较和数据库更新脚本生成仅在Visual Studio 2010 Premium/Ultimate 版本中可用。

但是,Visual Studio 中的模式比较和更新脚本生成功能是否与Redgate SQL 比较工具中的功能一样丰富?(我也没有用过)我没能找到功能比较列表。任何人都使用过它们,可以帮助说清楚吗?

schema tools feature-comparison scripting

17
推荐指数
2
解决办法
3606
查看次数

SQL Server - 向现有表添加不可为空的列 - SSDT 发布

由于业务逻辑,我们需要在表中添加一个新列,以确保始终填充该列。因此,应将其添加到表中NOT NULL。与之前解释如何手动执行此操作的问题不同,这需要由 SSDT 发布管理。

由于一些认识,我一直在用头撞墙一段时间来完成这个听起来简单的任务:

  1. 默认值不合适,不能是计算列。也许它是一个外键列,但对于其他列,我们不能使用像 0 或 -1 这样的假值,因为这些值可能具有重要意义(例如数字数据)。
  2. 在预部署脚本中添加列将在第二次自动尝试创建同一列时发布失败(即使预部署脚本被编写为幂等)(这真的很糟糕,否则我可以想一个简单的解决方案)
  3. 每次发生 SSDT 架构刷新时,在部署后脚本中将列更改为 NOT NULL 将被恢复(因此,至少我们的代码库将在源代码控制和服务器上的实际内容之间不匹配)
  4. 现在将列添加为可空,以便将来更改为 NOT NULL 在源代码管理中的多个分支/分支中不起作用,因为目标系统在下次升级时不一定都具有相同状态的表(并不是说这无论如何都是一个好方法 IMO)

我听别人说的方法是直接更新表定义(这样schema刷新是一致的),写一个预部署脚本,表的全部内容移动到一个包含新列填充逻辑的临时表,然后移动后部署脚本中的行。尽管如此,这似乎很危险,并且当它检测到一个 NOT NULL 列被添加到一个包含现有数据的表中时仍然会激怒发布预览(因为验证在预部署脚本之前运行)。

我应该如何添加一个新的、不可为空的列,而不会冒孤立数据的风险,或者在每次发布时使用固有风险的冗长迁移脚本来回移动数据?

谢谢。

null sql-server scripting ssdt

16
推荐指数
1
解决办法
5510
查看次数

用户共享查询:动态 SQL 与 SQLCMD

我必须重构并记录一些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)

sql-server scripting dynamic-sql sqlcmd

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

以自动化方式编写 Oracle DDL 脚本

Oracle SQL Developer 能够通过Tools -> Database Export...这种方式导出 DDL效果很好,但需要人工干预。

我知道DBMS_METADATA.get_ddl(),但发现导出并不完美。我遇到了导出的DBMS_METADATADDL 无法使用的问题,如果没有首先解决诸如关键字中间中断之类的问题,甚至更糟。但是,如果有人知道一种DMBS_METADATA无需手动修复即可运行的导出 DDL 的方法,那也将是一个很好的解决方案。

基本上,我正在寻找一种自动/脚本化的方式来导出通过手动方式导出的 DDL相同的DDL 。

我怎样才能做到这一点?

oracle export scripting oracle-sql-developer ddl

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

SQL Server / T-SQL 是否支持换行以拆分长字符串?

有时我有一个 SQL 脚本,其中包含一个或多个超长(有时甚至是愚蠢的)字符串。通常这些是VARBINARY代表文件/程序集的文字/常量,但有时它们是文本。

真正长字符串的主要问题是一些文本编辑器不能很好地处理它们。例如,我VARBINARYCREATE 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)

给我一个错误。

sql-server ssms scripting t-sql

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

删除列上的约束(索引)

如何修改带有索引的表的类型?我试图在一个空表上做一个改变列来修改从日期时间到 varchar(15) 的类型,并得到错误说它依赖于列(结果是索引)。

通过右键单击索引并编写 drop 脚本,我能够在本地轻松解决此问题,但是我需要在无法访问索引名称的其他服务器上推出此功能。

有没有办法制作一个可以删除任何索引的脚本,让我在列上更改数据类型然后读取索引?谢谢!

sql-server constraint scripting alter-table

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

使用点命令编写 SQLite 脚本

是否可以编写包含 SQLite 点命令( vis. .read file.sql; .separator ,; .import file.csv;)的脚本?

我正在构建并反复重建 SQLite 数据库,每次重建数据库时都需要输入大约 24 个点命令语句。如果我可以将这些命令放在脚本中并让 SQLite 读取它们,那就太好了。

有没有办法将点命令(而不是SQL 语句)放入脚本并让 SQLite 运行它们?

我在 Mac OS X 上使用 bash。

sqlite scripting

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