小编ber*_*d_k的帖子

建立基线和基准

当您被新店聘为 DBA 时,您将使用哪些重要工具来为 50 多个实例建立基线和实施基准?您的建议将不胜感激。

benchmark sql-server

5
推荐指数
1
解决办法
211
查看次数

是否有其他站点禁止 SQL 开发人员使用 c 样式注释?

我个人的观点是,sql 开发者不应该使用 C 风格的注释。

C 风格注释的问题是,它们不嵌套。

C 样式注释是支持的救命稻草之一,当它们必须在存储过程中进行一些临时更正时,但只有当它们不必与现有的 C 注释抗争时,才能很好地工作。

style

5
推荐指数
1
解决办法
248
查看次数

出现哪些问题,将所有 varchar 参数的大小声明为存储过程中的最大值?

这个问题,似乎其他网站也有随着时间的推移增加列大小的问题。

仅增加表中列的大小是一项相当简单的任务。

但是,当您的商店遵守存储过程参数的长度必须与相应表列的长度相匹配的规则时,通过您的存储过程进行的大量更改就会下降。

锁定在 Oracle 显示,该过程不需要知道 varchar2 参数的长度。

当您将每个 varchar 参数声明为 varchar(max) 或 nvarchar(max) 时,其优缺点是什么?

显然,您可以忘记每次增加色谱柱尺寸时都必须调整程序的维护噩梦。

对 SQLRockStar 的回答: 我想保留一个相当保守的表设计,其中已知长度有限的字段根据当前限制建模,而不为将来可能的扩展保留。

我的许多表都包含一个 id int、一个代码 varchar(30) 和一个描述列 varchar(255)。

代码字段必须反映不同客户的本地命名约定。

一些客户需要将此字段增加到 50。

当我不将长度编码到程序参数中时,我只需要调整这个单一客户的表列。

当我坚持将长度编码到参数中时,那么我要么支持不同客户的不同版本的程序,要么我不得不更改并将更改推出给所有客户。

例子

-- SQL Server
Create Table dbo.SQLServerTable (
    id int identity(1,1) primary key not null,
    code varchar(30) not null,
    description varchar(255) not null
);
go
Create Procedure WrapInsertSQLServer1 (
    @code varchar(30),
    @description varchar(255)
) as
INSERT INTO SQLServerTable values (@code, @description);
go      

Create Procedure WrapInsertSQLServer2 (
    @code …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 varchar t-sql

5
推荐指数
1
解决办法
4569
查看次数

将多个 SQL Server 表复制到只读 SQLite 数据库的最佳方法是什么?

我有一个包含大约 50 个表的数据库,共使用了大约 1 GB 的空间。SQLite 数据库将是只读的。此复制将每月进行一次。

编辑:

我看到一种可能的解决方案是通过 SQLite 3 ODBC 驱动程序使用链接服务器,这会产生相当简单的 t-sql 脚本。我不知道它的性能。

我猜其他解决方案需要更多的工作,但获得更好的性能。

sqlite sql-server

5
推荐指数
1
解决办法
716
查看次数

如何用 varchar2(4000) 列替换 CLOB 列?

下面的代码似乎可以完成这项工作,但我怀疑它是否足够健壮。

SET serveroutput on 

DECLARE
    v_isclob PLS_INTEGER;
    v_cmd    VARCHAR2(4000);
BEGIN
    SELECT CASE when exists (select * from USER_TAB_COLUMNS where COLUMN_NAME = 'Column_to_modify' AND TABLE_NAME = 'MyTable' AND DATA_TYPE = 'CLOB') then 1 else 0 end into v_isclob FROM DUAL;
    IF v_isclob > 0 THEN
        BEGIN
            EXECUTE IMMEDIATE 'ALTER TABLE MyTable RENAME COLUMN Column_to_modify  TO XXX';

            EXECUTE IMMEDIATE 'ALTER TABLE MyTable ADD Column_to_modify varchar2(4000)';

            EXECUTE IMMEDIATE 'UPDATE MyTable SET Column_to_modify = SUBSTR(XXX, 1, 4000)';

            EXECUTE IMMEDIATE 'ALTER TABLE MyTable DROP COLUMN …
Run Code Online (Sandbox Code Playgroud)

oracle

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

是否有任何原因不在 SSMS 中默认启用 SQLCMD 模式?

我不认为“只是为了确保脚本不需要 sqlcmd-mode”是一个正当理由。

在向我的同事发出启用此设置的命令之前需要考虑什么?

sql-server ssms sqlcmd

5
推荐指数
1
解决办法
1689
查看次数

如何编写检查约束以禁止空 varchar 字段?

在 SQL Server 上,不可为空的 varchar 列可以包含空字符串。

在 ORACLE 下它们不能,因为 varchar2 将 '' 视为等同于 NULL。

如果您设计的数据库架构适用于两个 RDBMS,那么向 SQL Server 上的每个不可为 null 的 varchar 列添加一个不允许空字符串的约束似乎是个好主意。

但哪种方法是制定这种约束的最佳方式?

我开始了

if OBJECT_ID('varchar_without_empty_cols') > 0 drop table varchar_without_empty_cols
go

create table varchar_without_empty_cols (
id int ,
val varchar(10) not null CHECK (val <> '') 
)
go


insert into varchar_without_empty_cols values (1, ' ')  -- this ought be OK
go
insert into varchar_without_empty_cols values (2, '')   -- this has to violate the check
go
insert into varchar_without_empty_cols …
Run Code Online (Sandbox Code Playgroud)

sql-server constraint

5
推荐指数
1
解决办法
8612
查看次数

在分配比变量长的 varchar 时,是否有强制错误的设置?

我想在将更长的 varchar 分配给变量并且没有静默截断时出现错误。有什么设置吗?

这将无声地截断:

declare @code varchar(10)
set @code = 'This is too long'
select @code
Run Code Online (Sandbox Code Playgroud)

将 varchar 插入较小的 Table 列

create table test (col1 varchar(10));
insert into test values ('This is too long');
Run Code Online (Sandbox Code Playgroud)

产生错误:

Meldung 8152, Ebene 16, Status 14, Zeile 2
String or binary data would be truncated.
The statement has been terminated.
Run Code Online (Sandbox Code Playgroud)

sql-server-2008

5
推荐指数
1
解决办法
650
查看次数

使用 [Oracle.DataAccess.Client] 执行块时,如何捕获 DBMS_OUTPUT.PUT_LINE 的输出?

在我的 oracle 数据库中,如果有下表:

Create table Test_call_count (
    count number(10)
);
insert into Test_call_count values (0);
Run Code Online (Sandbox Code Playgroud)

现在我可以运行以下 PowerShell 脚本

if ($ora_loaded -eq $null)
{
    $ora_loaded = [System.Reflection.Assembly]::LoadWithPartialName("Oracle.DataAccess") 
}

$ConnectionString = "Data Source=YOUR_TNS;User ID=YOUR_ID;Password=YOUR_Password" 


function Execute-NonQuery
{
    param (
        $sql
    )

        $conn = new-object Oracle.DataAccess.Client.OracleConnection 
        $conn.ConnectionString = $ConnectionString 
        $cmd = new-object Oracle.DataAccess.Client.OracleCommand($sql,$conn)
        $conn.open()
        $cmd.ExecuteNonQuery()
        $conn.close()
}

Execute-NonQuery "begin update  Test_call_count set count = count + 1;DBMS_OUTPUT.PUT_LINE('Test...'); end;"
Run Code Online (Sandbox Code Playgroud)

查看我可以验证的数据库,每次调用都会增加计数。

但是有没有办法扩展它,以便我可以将数据发送到 DBMS_OUTPUT ?

oracle ado.net

4
推荐指数
1
解决办法
6916
查看次数

有没有办法只在定义更改时替换 SQL Server 存储过程?

我知道以下两种模式来编写创建存储过程的脚本,可以重复执行而不抛出错误。

if object_id('my_proc') > 0 drop procedure my_proc
go
create procedure dbo.my_proc as Print 'This is not a dummy';
Run Code Online (Sandbox Code Playgroud)

另一个保留权限

if object_id('my_proc') is null
    EXEC ('create procedure dbo.my_proc as Print ''This is a dummy''');
go
ALTER PROCEDURE dbo.my_proc as Print 'This is not a dummy';
    
Run Code Online (Sandbox Code Playgroud)

我猜当该过程存在并且其哈希码与新版本的哈希码相同时,就不需要删除并重新创建或更改该过程。

我的问题是HashBytes被限制为最多 8000 个字节,我不能像这样使用它

if object_id('my_proc') is null
    EXEC ('create procedure dbo.my_proc as Print ''This is a dummy''');
go
if object_Id('my_proc') > 0
and
(
Select HashBytes('MD5',definition) MD5
from sys.sql_modules m
join sysobjects …
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures

4
推荐指数
1
解决办法
3151
查看次数