早期版本的 SQL-Server 不推荐使用分号来终止 sql 语句。
从 sql-server-2008 示例开始,现在 Microsoft 建议以分号结尾。
有一些格式化工具可以格式化 sql 查询并添加分号。我认为基本功能在 SMO 的某个地方。
唯一的问题是这些工具会删除所有注释。
任何想法如何保留所有评论以及如何添加所有推荐分号?
让我们回顾一下SQL-Server 的dba.exchange Oracle 问题。
这是 SaUce 的代码,经过一些格式化:
CREATE PROCEDURE GetCustomer
@FirstN nvarchar(20) = NULL,
@LastN nvarchar(20) = NULL,
@CUserName nvarchar(10) = NULL,
@CID nvarchar(15) = NULL
as
begin
DECLARE @sql nvarchar(4000)
SELECT @sql = 'C_FirstName, C_LastName, C_UserName, C_UserID
FROM CUSTOMER
WHERE 1=1 '
IF @FirstN IS NOT NULL
SELECT @sql = @sql + ' AND C_FirstName like @FirstN '
IF @LastN IS NOT NULL
SELECT @sql = @sql + ' AND C_LastName like @LastN '
IF @CUserName IS …Run Code Online (Sandbox Code Playgroud) 我刚刚找到了以下代码:
CREATE FUNCTION dbo.JoinDateAndTime
(
@d datetime,
@t datetime
)
RETURNS Datetime
as
BEGIN
declare @res datetime
set @res = convert (datetime, Convert(varchar(10), @d, 104) + ' ' + convert(varchar(8), @t, 108), 104)
return @res
END
go
Run Code Online (Sandbox Code Playgroud)
在看到如何在没有时间部分的情况下获取当前日期的答案后,我确信涉及到 varchar 的转换不是最好的解决方案。
顺便说一句,我搜索了这个问题,但只找到了 mySql 的解决方案。
给定一个列 col1 的表,如下所示:
create table MyTest (
col1 int NULL,
col2 decimal(7, 2) NULL
);
insert into MyTest values ( 1, 1.1);
Run Code Online (Sandbox Code Playgroud)
有没有办法让更新触发器决定执行以下哪个更新语句?
A:
update MyTest set col1 = 3;
Run Code Online (Sandbox Code Playgroud)
乙:
update MyTest set col1 = 3, col2 = 1.1;
Run Code Online (Sandbox Code Playgroud) 我知道如何使用 PowerShell 和 SMO 编写存储过程脚本:
[System.reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | out-null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | out-null
$srv = New-Object "Microsoft.SqlServer.Management.Smo.Server"
$srv.databases['MyDatabase'].StoredProcedures['MyProc'].TextBody
Run Code Online (Sandbox Code Playgroud)
但由于我想在查询中使用过程文本,我想知道是否可以在纯 T-SQL 中以某种方式调用 SMO。
只能在开发环境中运行。
顺便说一句:返回具有给定名称的存储过程定义的函数可以解决我当前的问题,但不能回答我的问题。
编辑:
当我使用这个查询时,我想找到哪些过程引用了给定的表:
SELECT p.name --, definition
FROM sys.sql_modules m
join sys.objects p on m.object_id = p.object_id
where p.type = 'P'
and definition like '%SearchForThis%'
Run Code Online (Sandbox Code Playgroud)
这与我想使用 SMO 获得的信息完全相同。
sql-server-2008 stored-procedures scripting sql-clr ole-automation
我提出关于迪纳利序列的问题,在这里和关于Oracle全球表标识列的仿真另外一个问题在这里。
我一直认为我可以相信身份值会不断增加。另一方面,我知道使用序列我永远无法确定它们中没有一些空白。
是时候适应序列中的差距,还是留在临时表中的标识列会更好?
sql-server sequence identity sql-server-2012 temporary-tables
从的TechNet给我的感觉,我要么必须明确地设置想要的填充因子或当我不指定它,默认的填充因子0 choosen。
对于我知道添加行的表,填充因子 0 不是一个好的选择。有没有办法重建索引,以便使用最后一个显式索引?
BTW:我认为这应该是默认设置。
在此处输入链接描述中,我展示了我如何记录数据库。
为了插入扩展属性,最初我使用 sp_addextendedproperty 调用的计划序列。
但是最近,当我在旧版本的数据库上运行脚本时,我想捕获有关不存在对象的错误。
我通过反复试验找到了以下工作代码
begin try
drop procedure dbo.BK_add_Tableproperty
end try begin catch end catch
go
create procedure dbo.BK_add_Tableproperty (
@table_name sysname,
@property_name nvarchar(max),
@Property_value sysname
)
as
declare @error integer;
begin try
EXEC sys.sp_addextendedproperty @name= @property_name,
@value = @Property_value,
@level0type=N'SCHEMA',
@level0name=N'dbo',
@level1type=N'TABLE',
@level1name=@table_name
end try begin catch
SET @error = @@ERROR;
if @error = 15135
Print 'Table missing no extended properties added: ' + @table_name
else if @error = 15233
Print 'Table has already property: …Run Code Online (Sandbox Code Playgroud) 目前,我遇到了一个生产 SQL Server 数据库,其中有人添加了几乎所有来自 DTA 的缺失索引建议。
表单如何确定索引是必需的还是必要的我已经了解到,存在 DMV 视图,可用于延迟有关实际索引使用情况以及缺失索引的信息。
Jason Srate的脚本仅使用该视图中的当前信息,而当天的乐趣 - 自动自动索引!将这些视图中的一些信息保存到表中。
另一方面,DTA 需要规划何时运行分析器、选择要分析的内容并对运行时的性能产生一些影响。
我的印象是,使用 DTA 作为第一步调优工具只是浪费时间,因为它的结果没有涵盖完整的数据库使用情况,新手很难理解,并且可能导致添加过多的索引,从而对写入性能产生负面影响,而通过 DMV 收集数据几乎不需要准备,几乎涵盖了自上次重启以来数据库的全部使用情况。
我的问题侧重于向管理层提出哪种策略。我想在第一步中专注于评估 DMV 视图,而完全忽略 DTA。
performance sql-server-2008 sql-server index-tuning database-tuning-advisor
我不是第一个注意到缺少此功能的人。
但我想知道是否有一些有用的解决方法。我想在同一个文件夹中部署一个主脚本和一些依赖脚本。
顺便说一句,Microsoft Connect 上有票吗?
编辑:
锁定于此,似乎等同于在 sqlcmd 模式下运行的脚本是否可以确定其在文件系统中的路径的问题。
第二次编辑:
从SO我找到了一种将脚本路径传递到 sqlcmd 的方法
sqlcmd -S myServer -d myDB -U user -P password -i file1.sql -v p1="D:\myscripts"
Run Code Online (Sandbox Code Playgroud)
我可以验证它是否传递给 File1.sql
PRINT '$(p1)'
:setvar path1 $(p1) + '\file1.sql'
:r $(path1)
Run Code Online (Sandbox Code Playgroud)
但是我没有找到在第二行中连接路径和文件名的正确方法。
第三次编辑: 我在这里找到了连接路径和文件名的解决方案。
PRINT '$(p1)'
:r $(p1)\file1.sql
Run Code Online (Sandbox Code Playgroud)
还有更好的方法吗?
sql-server ×7
performance ×2
identity ×1
index ×1
index-tuning ×1
scripting ×1
sequence ×1
sql-clr ×1
sqlcmd ×1
syntax ×1
transaction ×1
trigger ×1