我正在重命名一些独特的约束以匹配我们的数据库对象命名约定。奇怪的是,有几个多行表值函数返回的表具有唯一约束,如下所示:
CREATE FUNCTION [dbo].[fn_name] (...)
RETURNS @Result
TABLE
(
ID BIGINT PRIMARY KEY,
...
RowNum BIGINT UNIQUE
)
BEGIN
...
RETURN
END
GO
Run Code Online (Sandbox Code Playgroud)
我尝试这样命名它,但不起作用:
CREATE FUNCTION [dbo].[fn_name] (...)
RETURNS @Result
TABLE
(
ID BIGINT PRIMARY KEY,
...
RowNum BIGINT
,CONSTRAINT UC_fn_name_RowNum UNIQUE([RowNum])
)
BEGIN
...
RETURN
END
GO
Run Code Online (Sandbox Code Playgroud)
当它是表变量函数定义的一部分时,是否可以设置唯一约束的名称?
t-sql sql-server-2012 set-returning-functions unique-constraint table-variable
我在存储过程执行期间使用以下结构创建临时表:
[ID] BIGINT
[Point] GEOGRAPHY
Run Code Online (Sandbox Code Playgroud)
该ID不是唯一的-大约有200每个记录ID。
我需要找到一个不同的列表,IDs其中至少有一个Point比Point常量值(例如200米)大的距离。
所以,我正在使用这样的东西:
SELECT DISTINCT DS1.[ID]
FROM DataSource DS1
INNER JOIN DataSource DS2
ON DS1.[ID] = DS2.[ID]
WHERE DS1.Point.STDistance(DS2.Point) > 200
Run Code Online (Sandbox Code Playgroud)
对于 23 000 个点,查询执行4-5几秒钟。因为我期待有更多的价值,所以我需要找到更好的解决方案。
我想如果有更快的方法,我总是可以创建一个物化表并实现额外的逻辑来计算它ID。
我创建了一个空间索引,但查询优化器没有使用它。如果我使用hint这样的WITH (INDEX(SPATIAL_idx_test))我会收到以下错误:
消息 8635,级别 16,状态 4,第 78 行
查询处理器无法为带有空间索引提示的查询生成查询计划。原因:空间索引不支持谓词中提供的比较器。尝试删除索引提示或删除SET FORCEPLAN. `
以下语句sp_configure 'clr enabled'返回:
name minimum maximum config_value run_value
clr enabled 0 1 0 0
Run Code Online (Sandbox Code Playgroud)
我认为这意味着没有CLR对象;但是,如果我执行以下语句,我会得到这些:
SELECT * FROM sys.assembly_files
Run Code Online (Sandbox Code Playgroud)

SELECT * FROM sys.assembly_types
Run Code Online (Sandbox Code Playgroud)

我已经读过了The HierarchyID type is available to CLR clients as the SqlHierarchyId data type.。
如何在没有CLR启用的情况下使用它,为什么我需要启用它来创建我自己的CLR对象?
我有一个处于FULL恢复模式的主数据库,它是Always On组的一部分。有没有办法在FULL恢复模式下最小化记录插入操作?
我有一个每天执行的进程,并在表中插入几百万条记录。随着操作的继续,事务日志文件的大小急剧增加(从 1 GB 到 40 GB)。
正如我所读到的,我可以使用一些未完INSERT全记录操作的变体,但我担心切换恢复模型的效果?
t-sql sql-server-2012 transaction-log availability-groups bulk-insert
我创建了一个简单的 CLR 函数来压缩/解压缩NVARCHAR列:
[SqlFunction(DataAccess = DataAccessKind.None, IsDeterministic = true)]
public static SqlBinary Compress( string str ){
if( str == null ){return new SqlBinary();}
if( String.IsNullOrEmpty( str ) ){str = " ";}
byte[] bytes = Encoding.Unicode.GetBytes( str );
using( MemoryStream msi = new MemoryStream( bytes ) ){
using( MemoryStream mso = new MemoryStream() ){
using( GZipStream gs = new GZipStream( mso, CompressionMode.Compress ) ){
msi.CopyTo( gs );
}
return new SqlBinary( mso.ToArray() );
}
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的压缩率大约是 4,或者如果我有 1024 …
在文档中明确指出:
更改对象名称的任何部分都可能破坏脚本和存储过程。我们建议您不要使用此语句重命名存储过程、触发器、用户定义函数或视图;相反,删除对象并使用新名称重新创建它。
重命名怎么样:
我将重命名上述所有对象以匹配我们的内部命名约定,但我想为此编写一个自动脚本(因为有数千个约束)。
我能想到的唯一问题是,如果索引与hintin 语句一起使用,它将被破坏。
您能说出任何其他不将sp_rename用于此类目的的原因吗?
我在同一台机器上有两个 SQL Server 实例。我想在其中一个数据库上创建加密备份,然后在第二个实例上还原它。我正在执行以下步骤:
在master将用于加密我们的证书的数据库中创建和备份数据库主密钥
USE MASTER;
GO
CREATE MASTER KEY
ENCRYPTION BY PASSWORD = 'MasterKey_Password';
GO
BACKUP MASTER KEY
TO FILE = 'E:\GKKeys\MASTER_KEY.key'
ENCRYPTION BY PASSWORD = 'MasterKey_BACKUP_Password';
GO
Run Code Online (Sandbox Code Playgroud)创建并备份将用于加密的证书:
USE MASTER;
GO
-- ????????? ??????????, ????? ?? ????????? ?? ?????????? ?? backup-a
CREATE CERTIFICATE BackupEncryptTestCert
WITH SUBJECT = 'smGK_BackupCertificate'
GO
BACKUP CERTIFICATE BackupEncryptTestCert
TO FILE = 'E:\GKKeys\SMGK_BACKUP_CERTIFICATE.cer'
WITH PRIVATE KEY
(
FILE = 'E:\GKKeys\SMGK_BACKUP_CERTIFICATE_PRIVATE_KEY.key'
,ENCRYPTION BY PASSWORD = 'smGK_BackupCertificate_BACKUP_Password'
);
Run Code Online (Sandbox Code Playgroud)创建备份:
BACKUP DATABASE smGK …Run Code Online (Sandbox Code Playgroud)我有两个包含完全相同数据的表。两个表都有bigint primary key identity column60 列和 300 000 行。不同之处在于第二个表的所有列都有sql-variant类型。
我正在创建临时表并从其中的两个表中导入数据。当从sql-variant列中提取数据时,它会被转换为相应的 SQL 类型。
从第一个表中提取数据是针对1 sec和从第二个表中提取的6 secs。
基本上,执行的差异在于估计:
并在read-ahead reads计数中:
我想知道为什么SQL Server不能提前加载从sql-variant字段中读取的数据(几乎没有read-ahead reads)。
此外,表的存储大小几乎相同:
为什么SQL Server认为它应该阅读67 GB?
列类型是:
16 x BIGINT
8 x DECIMAL(9,2)
36 x NVARCHAR(100)
Run Code Online (Sandbox Code Playgroud)
该dbcc dropcleanbuffers命令每次在数据提取和填充之前使用。
为了进行测试,您可以从这里下载示例数据文件。然后,
Tech05_01_TableDefinitions.sqlTech05_02_TablePupulation.sql打开Tech05_03_TestingInsertionInTempTable.sql文件并像这样执行一次:
DECLARE @TableStructured SYSNAME = '[dbo].[NormalDataTypes_60Cols]';
DECLARE @TableFromWhichDataIsCoppied …Run Code Online (Sandbox Code Playgroud)sql-server sql-server-2012 sql-variant-property sql-server-2014 standard-edition
我在用于日志记录的表上有一个聚集的列存储索引 - 仅插入(但不是批量插入)。当前的表统计是:
我今天早上通过以下操作看到以下操作sp_whoisactive:
ALTER INDEX [...] ON [...].[...]
REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = COLUMNSTORE_ARCHIVE);
Run Code Online (Sandbox Code Playgroud)
我使用以下查询来检查row_group_id我们有多少行:
SELECT
tables.name AS table_name,
indexes.name AS index_name,
partitions.partition_number,
dm_db_column_store_row_group_physical_stats.row_group_id,
dm_db_column_store_row_group_physical_stats.total_rows,
dm_db_column_store_row_group_physical_stats.deleted_rows,
dm_db_column_store_row_group_physical_stats.state_desc,
dm_db_column_store_row_group_physical_stats.trim_reason_desc
FROM sys.dm_db_column_store_row_group_physical_stats
INNER JOIN sys.indexes
ON indexes.index_id =
dm_db_column_store_row_group_physical_stats.index_id
AND indexes.object_id =
dm_db_column_store_row_group_physical_stats.object_id
INNER JOIN sys.tables
ON tables.object_id = indexes.object_id
INNER JOIN sys.partitions
ON partitions.partition_number =
dm_db_column_store_row_group_physical_stats.partition_number
AND partitions.index_id = indexes.index_id
AND partitions.object_id = tables.object_id
Run Code Online (Sandbox Code Playgroud)
我们3383用1048576行和很少的行来排列组,如下所示: …
sql-server ×6
t-sql ×4
sql-clr ×2
backup ×1
bulk-insert ×1
columnstore ×1
compression ×1
encryption ×1
spatial ×1
update ×1
varchar ×1