标签: sql-server-2016

如何像数组一样访问表数据类型?

我试图将数据存储在一个表变量中@coordinates,该变量包含 2 行和 2 列:纬度和经度。

存储价值:

declare @coordinates table(latitude decimal(12,9), longitude decimal(12,9)) 
insert into @coordinates select latitude, longitude from loc.locations where place_name IN ('Delhi', 'Mumbai')
Run Code Online (Sandbox Code Playgroud)

查看值:

select * from @coordinates
Run Code Online (Sandbox Code Playgroud)

结果:

latitude    longitude
28.666670000    77.216670000
19.014410000    72.847940000
Run Code Online (Sandbox Code Playgroud)

但我想一一访问这些值,例如:@coordinates[1][1] 或 @coordinates.latitude[1]

或任何可能的简单方法?

sql-server sql-server-2016

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

如何在 32 位服务器上获取 Sql Server 2016?

我没有构建它,但我们有一个 32 位的 Windows Server 2008,带有 SQL Server 2008 和 4GB 的 RAM。

我需要将它升级到 SQL Server 2016,以便将日志传送到新服务器,这样我们就可以摆脱困境。

问题 - 看起来 SQL Server 2016 至少需要 Windows Server 2012,它只有 64 位。

问题:如何将数据迁移到 SQL 2016 服务器,停机时间小于 1 天?

有没有办法通过兼容性级别来解决它?

sql-server-2008 sql-server sql-server-2016

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

如何从带有多个选择语句结果的 SQL 作业发送电子邮件

我想创建一个 SQL 作业并发送包含多个选择语句的电子邮件,包括查询结果。是否可以使用 SQL Job 或者我应该使用 SSIS?

编辑1:

EXEC msdb.dbo.sp_send_dbmail  
    @profile_name = 'Adventure Works Administrator',  
    @recipients = '****@abc.com', 
    @Execute_query_database = 'AdventureWorks',
    @query = 'SELECT COUNT(*) FROM AdventureWorks.Production.WorkOrder  
                  WHERE DueDate > '2018-03-30'  
                  AND  DATEDIFF(dd, '2004-04-30', DueDate) < 2
              SELECT * FROM NorthWind.Production.Work  
                  WHERE DueDate > '2018-04-30'  
                  ' ,  
    @subject = 'Work Order Count',  
    @attach_query_result_as_file = 1 ;
Run Code Online (Sandbox Code Playgroud)

错误消息:文件附件或查询结果大小超过了 1000000 字节的允许值。

编辑 2:我觉得 SQL 代理作业没有指向所需的数据库,并且 sp_send_email 没有数据库名称。所以我添加了@Execute_query_database = 'AdventureWorks'但仍然没有改进,因为在 SQL SELECTS 中使用了两个不同的数据库。

有什么想法吗?

sql-server ssms sql-server-agent sql-server-2016

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

如何回滚 SQL Server 事务并使用输出参数?

我试图在存储过程中设置一个输出参数,但我认为当我回滚事务时,我认为我也将分配回滚到@out. 那是对的吗?

如果是这样,我如何返回消息并回滚事务?我正在@out从 C#获取参数。

create PROCEDURE [dbo].[sp]
@out varchar(2000) output
AS
BEGIN
    SET NOCOUNT ON
    BEGIN TRANSACTION
    BEGIN TRY
        SET @OUT = "success";
        COMMIT TRANSACTION
    END TRY

    BEGIN CATCH
        set @out = 'not success';
        ROLLBACK TRANSACTION
    END CATCH
END
Run Code Online (Sandbox Code Playgroud)

我原本是在做一个

SELECT 
    ERROR_NUMBER() AS ErrorNumber,
    ERROR_SEVERITY() AS ErrorSeverity,
    ERROR_STATE() AS ErrorState,
    ERROR_PROCEDURE() AS ErrorProcedure,
    ERROR_LINE() AS ErrorLine,
    ERROR_MESSAGE() AS ErrorMessage;
Run Code Online (Sandbox Code Playgroud)

...但这没有帮助,尽管我更喜欢这种方法。

sql-server stored-procedures error-handling ssdt sql-server-2016

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

没有完整备份的数据库差异备份

晚上 10 点,我安排了一个 SQL 代理作业,按照时间表进行每日备份:

  • 每日全场:22:00
  • 差价:每4小时
  • 日志:每 30 分钟

现在,当我检查我的备份集时(假设在 22:30),我看到差异备份已经发生,而没有任何完整备份!!。

我没想到会在明天 16:00 之前第一次完全备份发生时看到备份作业启动并运行,但是,我有一个没有完整备份的差异备份?这怎么可能?

backup sql-server-2016

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

SQL Server LicenseType 已禁用

我已经安装了 SQL Server 2016 Enterprise 并应用了许可证密钥,但是

SERVERPROPERTY('LicenseType') is disbaled and  
SERVERPROPERTY('NumLicenses') is null
Run Code Online (Sandbox Code Playgroud)

对于 SQL Server 2016,注册表中没有如下键:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL13.SQL2016\Setup

知道如何更改 SQL Server 的 LicenseType 吗?

sql-server sql-server-2016

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

SSIS 与 T-SQL 连接性能,同一服务器上的差异数据库

我们正在研究 SSIS Lookup 和 T-SQL Join 之间的性能差异。我们要连接两个表;表位于同一个 SQL 服务器实例中,不同的数据库中。

我怀疑对于小表连接,差异很小或可以忽略不计。在这种情况下,我们的团队更喜欢 T-SQL,它比编写图表更容易编码/脚本。此外,在 DevOps 角度,我们可以在 DB 项目中编译/构建脚本;不幸的是,SSIS 不会正确编译 T-SQL,我可以在 SSIS 执行 SQL 语句中编写“testabcd”,并且该项目仍将构建/编译。

但是,对于需要更长时间处理的大量行,什么更快?具有索引和统计信息的 T-SQL 或全部在内存中进行的 SSIS?

我以不同的观点阅读了这些文章,团队正在努力达成共识。

https://derekdb.wordpress.com/2012/03/13/ssis-lookup-or-t-sql-join/ http://www.sqlservercentral.com/blogs/jamesserra/2011/08/29/when- to-use-t_2D00_sql-or-ssis-for-etl/

让我们假设,T-SQL 引擎和 SSIS 提供相同的硬件:CPU 和内存。鉴于相同的规格,我想从内部算法的角度了解性能速度。

performance sql-server ssis sql-server-2016 performance-tuning

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

为混合 Always on Environment+ 实例创建 Windows 登录/用户,而无需 Always ON

我如何通过更改以下脚本来在启用/未启用 Always ON 的环境中运行。在 Kin 提供了一些非常有用的建议之后,下面似乎正在起作用。但是,当我需要跨 300-400 个 SQL 服务器进行部署时,此代码肯定不会处于最佳状态,而有些总是在其他服务器上没有。

请帮我修改/检查实例是否启用了AG并成功执行

更新根据@Kin 的要求

SET NOCOUNT ON   

 DECLARE @user_to_be_added sysname  
 SET @user_to_be_added = 'Domain\user'  

 DECLARE @sqltext nvarchar(max) = N''  

     if (select serverproperty('IsHadrEnabled')) = 0

  BEGIN

           -- change  to your user to be added .. make sure that the login is already existing

       SELECT  @sqltext += char(10)+ 'use '+quotename(name)+';'+char(10)+ 'CREATE USER '+quotename(@user_to_be_added)+' FOR LOGIN '+quotename(@user_to_be_added)

       FROM sys.databases where state_desc ='ONLINE' AND databaseproperty(name,'isReadOnly') = 0 

       SELECT  @sqltext

 END

    Else

 BEGIN


      SELECT  @sqltext …
Run Code Online (Sandbox Code Playgroud)

sql-server availability-groups sql-server-2014 sql-server-2016

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

转换日期并按年份过滤

我有一个“yyyymmdd”格式的日期字段,我需要使用该字段按年份过滤查询。

例如,在我的表中有一个“发布日期”字段,格式为“20180401”,我需要将查询过滤为仅包含 2018 年的记录。

sql-server type-conversion cast date sql-server-2016

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

获取包含 INSERT 的存储过程的“列表”,而无需命名所涉及的列

作为某些增强功能的一部分,750 多个表中添加了一个新列。现在我的问题是在将近 3000 多个存储过程中,一些旧的 INSERT 没有命名列。

有什么办法可以得到所有没有列名插入的存储过程的“列表”?

我试过了:

SELECT OBJECT_NAME(object_id)
FROM sys.sql_modules
WHERE definition LIKE '%insert into%' 
AND definition NOT LIKE '%) value%'
AND definition NOT LIKE '%)%' + CHAR(10) + '%value%'
AND definition NOT LIKE '%)%' + CHAR(13) + '%value%'
AND definition LIKE '%value%' 
Run Code Online (Sandbox Code Playgroud)

但它仍然错过了很多。

PS - 上面的查询也返回 Insert Into (ColumnNames) SELECT 场景,这是我不想要的。

sql-server stored-procedures t-sql sql-server-2016

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