标签: t-sql

SSMS 中表的哪些更改会导致 DROP/CREATE,并且可以使用 TSQL 始终避免这种情况吗?

我知道在某些情况下,通过 SSMS 的 GUI 对表进行某些更改(例如,更改列的类型)将导致表被删除并重新创建。

我的问题是,对于导致这种行为的具体变化是否存在完整的定义?通过运行而不是使用 SSMS GUI 是否可以始终避免这种行为ALTER TABLE(如果不能,哪些可以避免,哪些不能)?

sql-server ssms t-sql alter-table

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

有没有办法使用 sysconv() 内置函数?

如果您使用以下方法获取某些视图的定义sys.sp_helptext

exec sys.sp_helptext 'sys.columns'

CREATE VIEW sys.columns
AS
  SELECT c.id                                                             AS object_id,
         c.NAME,
         c.colid                                                          AS column_id,
         c.xtype                                                          AS system_type_id,
         c.utype                                                          AS user_type_id,
         c.length                                                         AS max_length,
         c.prec                                                           AS PRECISION,
         c.scale,
         CONVERT(SYSNAME, CollationPropertyFromId(c.collationid, 'name')) AS collation_name,
         sysconv(bit, 1 - ( c.status & 1 ))                               AS is_nullable,-- CPM_NOTNULL  
         sysconv(bit, c.status & 2)                                       AS is_ansi_padded,-- CPM_NOTRIM  
         sysconv(bit, c.status & 8)                                       AS is_rowguidcol,-- CPM_ROWGUIDCOL  
         sysconv(bit, c.status & 4)                                       AS is_identity,-- CPM_IDENTCOL  
         sysconv(bit, c.status & 16)                                      AS is_computed,-- CPM_COMPUTED  
         sysconv(bit, c.status & 32)                                      AS …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

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

获取消息 15151,无法更改用户“xxxx”,因为它不存在或您没有权限

我有以下脚本,但执行时不断出现错误。

USE [master]
GO

If Not EXISTS (Select loginname from [master].[dbo].[syslogins]
    Where name = 'xxxx' and dbname = 'xxxx-xxxx')
BEGIN
    CREATE LOGIN [xxxx] WITH PASSWORD=N'xxxxx', DEFAULT_DATABASE=[xxxx-xxxx], DEFAULT_LANGUAGE=[us_english], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
    ALTER LOGIN [xxxx] ENABLE
END
GO

USE [xxxx-xxxx]
ALTER USER [xxxx] WITH DEFAULT_SCHEMA=[db_datareader]
ALTER ROLE [db_datareader] ADD MEMBER [xxxx]
ALTER ROLE [db_datawriter] ADD MEMBER [xxxx]
ALTER ROLE [db_owner] ADD MEMBER [xxxx]
GO
Run Code Online (Sandbox Code Playgroud)

我尝试了该脚本的几种排列,但没有成功。它确实创建了登录名,但不允许我更改“用户”或“角色”属性。当我可以让它正常工作时,它不会对用户配置文件进行更改。

sql-server t-sql

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

无法打开数据库。正在恢复中

我已经执行了这两个命令:

USE master
GO

RESTORE DATABASE test
FROM Kingston
WITH NORECOVERY
GO
Run Code Online (Sandbox Code Playgroud)
USE master
GO
RESTORE LOG test
FROM Kingston
WITH STOPAT = '2020-05-13 14:05:25', RECOVERY;
GO
Run Code Online (Sandbox Code Playgroud)

但现在我在访问数据库时遇到此错误USE test GO

无法打开数据库“测试”。它正处于恢复过程中。

当它显然不是的时候。有什么建议如何修复它吗?到目前为止发现这RECOVERY有帮助,但正如你所看到的,它没有帮助。

编辑

更改NORECOVERYRECOVERY没有帮助,因为这样我无法执行第二个命令(引发错误),并且我在特定时刻需要该日志。

编辑

我已经找到了解决方案。您需要额外的命令:

RESTORE DATABASE test
WITH RECOVERY
GO
Run Code Online (Sandbox Code Playgroud)

似乎RECOVERY在命令中被忽略RESTORE LOG,并且需要额外的命令来确认恢复已完成。不过我很感激你的帮助。

sql-server t-sql recovery

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

为什么只需在 T-SQL 中重新分配值就可以切换两个列值?

例如,以下查询按照 Microsoft SQL Server (T-SQL) 中的预期工作。

UPDATE Customer
SET ContactName = Customer.City, City = Customer.ContactName;
Run Code Online (Sandbox Code Playgroud)

我想知道为什么上面的方法有效。我原以为会Customer.City保持不变。为什么会出现这种情况?

如果您可以提供一些来源,以便我可以阅读有关这些主题的更多信息,我将不胜感激。

谢谢。

sql-server t-sql

5
推荐指数
2
解决办法
429
查看次数

IGNORE_DUP_KEY = ON 的索引过滤掉非重复记录

下面是一个脚本,可用于重现我面临的问题。基本上问题是这样的:为什么(ID1 = 6,ID2 = 7)的记录没有填充到最终的#tt2表中?我可以手动插入它,所以它不会违反 UNIQUE 约束,但它不会作为 INSERT/SELECT 的一部分进行填充。

USE [tempdb]
GO 

IF OBJECT_ID('tempdb..#t1') IS NOT NULL DROP TABLE #t1
CREATE TABLE [#t1] ([ID] INT , [V] VARCHAR(10))

INSERT INTO #t1 (ID, V) 
VALUES
(1,'A'),
(2,'B'),
(3,'B'),
(4,'C'),
(5,'E'),
(6,'E')

IF OBJECT_ID('tempdb..#t2') IS NOT NULL DROP TABLE #t2
CREATE TABLE [#t2] ([ID] INT , [V] VARCHAR(10))

INSERT INTO #t2 (ID, V) 
VALUES
(1,'A'),
(2,'B'),
(3,'C'),
(4,'C'),
(5,'D'),
(6,'E'),
(7,'E')

IF OBJECT_ID('tempdb..#tt') IS NOT NULL DROP TABLE #tt

SELECT t1.ID AS …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql unique-constraint

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

为连接表授予大内存

当我从两个连接表中选择列时,会获得巨大的内存授予(529808)。如果我单独查询每个表列,它的组合内存授予仅为 8008。

为什么组合的列列表有如此大的内存授予?或者我可以采取哪些步骤来找出答案?

SELECT *内存授予量为 529808: 在此输入图像描述


仅查询第一个表中的列的内存授予量为 6152: 在此输入图像描述


仅查询另一个表中的列的内存授予量为 1856 在此输入图像描述

sql-server t-sql memory-grant

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

SQL Server 中选择查询的区分大小写排序规则

我们的 SQL Server 的排序规则设置为SQL_Latin1_General_CP1_CI_AS

我有一个要求,即我们在不同的情况下具有相同的值,但 SQL Server 会以相同的方式对待它们,因为我们的排序规则在服务器级别设置为不区分大小写。我的要求是,我需要根据一个特定查询的大小写敏感性将每个值视为不同的。我COLLATE SQL_Latin1_General_CP1_CS_ASWHERE子句中使用来强制区分大小写。我的问题是:此排序规则是否仅应用于此查询,还是最终会在列或表级别为使用此列的所有查询更改此设置?

Create Table #tmpTest 
(
id int primary key identity(1,1),
name varchar(100)
)

Insert Into  #tmpTest  values ('TestQuery'),('TESTQUERY'),('TEstquerY')

Select * from #tmpTest
 Where name = 'TestQuery'

Select * from #tmpTest
 Where name = 'TestQuery'
 Collate SQL_Latin1_General_CP1_CS_AS
Run Code Online (Sandbox Code Playgroud)

sql-server query collation t-sql sql-server-2012

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

sp_executesql 不使用参数

我遇到了一个奇怪的动态 sql 问题,我认为这是某种格式问题,在过去的几个小时里我一直在为此抓狂。我非常感谢我能得到的任何帮助。

对于一些背景信息,此存储过程的目的是清理我们的集中式 (hq) 数据库中的数据,该数据库应该拥有我们所有商店的所有记录的完整副本。如果重要的话,我们正在运行 Microsoft Dynamics RMS (2.0.2022) 和 SQL 2014 Standard(对于总部,商店使用 Express)。

最初我打算将 sql 语句放在参数中并使用 exec 命令,但是虽然我不经常使用它,但我认为 sp_executesql 看起来更干净,并且更容易将查询重用为模板并进行更改他们。现在我只有一些选择的脚本,但是一旦它们完成,我将创建一个额外的存储过程来插入、删除和更新记录。

执行 sql 语句有效,但出于某种原因,我无法让 sp_executesql 使用存储过程中的参数。无论我将参数更改为什么,包括在存储过程中使用静态值,它都只会输出参数名称。所以无论:

@LS = @LinkedServer
Run Code Online (Sandbox Code Playgroud)

或者

@LS = 'StaticLinkedServerName'
Run Code Online (Sandbox Code Playgroud)

它返回的错误信息是:

在 sys.servers 中找不到服务器“@LS”。验证是否指定了正确的服务器名称。如有必要,执行存储过程 sp_addlinkedserver 将服务器添加到 sys.servers。

无效的解决方案

CREATE PROCEDURE [dbo].[usp_bn_ShowStoreHQSync]  
(
      @StoreCode        NVARCHAR(10)
     ,@LinkedServer     NVARCHAR(50)    
     ,@StoreDB          NVARCHAR(40)
)
AS          
BEGIN   
    BEGIN TRANSACTION
        BEGIN TRY
            IF @StoreCode IS NULL
                RAISERROR('@StoreCode Cannot Be NULL',15,1)
            ELSE IF @StoreCode NOT IN (SELECT StoreCode FROM [HQDB].[dbo].[Store])
                RAISERROR('@StoreCode Not In DB',15,1) …
Run Code Online (Sandbox Code Playgroud)

sql-server dynamic-sql t-sql

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

有没有办法按字母数字列排序?

我有一个表单位

单位名称
单元1
2b单元
2c单元
单元2a
单元10
单元3a
3c单元
第11单元

我想排序相同

单位名称
单元1
单元2a
2b单元
2c单元
单元3a
3c单元
单元10
第11单元

我们如何在 t-sql 中实现这一点?

数据定义语言

create table units (unitname varchar(20))
insert into units values ('unit 1'),('unit 2b'),('unit 2c'),
('unit 2a'),('unit 10'),('unit 3a'),('unit 3c'),('unit 11')
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server-2012

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