我知道在某些情况下,通过 SSMS 的 GUI 对表进行某些更改(例如,更改列的类型)将导致表被删除并重新创建。
我的问题是,对于导致这种行为的具体变化是否存在完整的定义?通过运行而不是使用 SSMS GUI 是否可以始终避免这种行为ALTER TABLE(如果不能,哪些可以避免,哪些不能)?
如果您使用以下方法获取某些视图的定义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) 我有以下脚本,但执行时不断出现错误。
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)
我尝试了该脚本的几种排列,但没有成功。它确实创建了登录名,但不允许我更改“用户”或“角色”属性。当我可以让它正常工作时,它不会对用户配置文件进行更改。
我已经执行了这两个命令:
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有帮助,但正如你所看到的,它没有帮助。
编辑
更改NORECOVERY为RECOVERY没有帮助,因为这样我无法执行第二个命令(引发错误),并且我在特定时刻需要该日志。
编辑
我已经找到了解决方案。您需要额外的命令:
RESTORE DATABASE test
WITH RECOVERY
GO
Run Code Online (Sandbox Code Playgroud)
似乎RECOVERY在命令中被忽略RESTORE LOG,并且需要额外的命令来确认恢复已完成。不过我很感激你的帮助。
例如,以下查询按照 Microsoft SQL Server (T-SQL) 中的预期工作。
UPDATE Customer
SET ContactName = Customer.City, City = Customer.ContactName;
Run Code Online (Sandbox Code Playgroud)
我想知道为什么上面的方法有效。我原以为会Customer.City保持不变。为什么会出现这种情况?
如果您可以提供一些来源,以便我可以阅读有关这些主题的更多信息,我将不胜感激。
谢谢。
下面是一个脚本,可用于重现我面临的问题。基本上问题是这样的:为什么(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) 当我从两个连接表中选择列时,会获得巨大的内存授予(529808)。如果我单独查询每个表列,它的组合内存授予仅为 8008。
为什么组合的列列表有如此大的内存授予?或者我可以采取哪些步骤来找出答案?
我们的 SQL Server 的排序规则设置为SQL_Latin1_General_CP1_CI_AS
我有一个要求,即我们在不同的情况下具有相同的值,但 SQL Server 会以相同的方式对待它们,因为我们的排序规则在服务器级别设置为不区分大小写。我的要求是,我需要根据一个特定查询的大小写敏感性将每个值视为不同的。我COLLATE SQL_Latin1_General_CP1_CS_AS在WHERE子句中使用来强制区分大小写。我的问题是:此排序规则是否仅应用于此查询,还是最终会在列或表级别为使用此列的所有查询更改此设置?
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 问题,我认为这是某种格式问题,在过去的几个小时里我一直在为此抓狂。我非常感谢我能得到的任何帮助。
对于一些背景信息,此存储过程的目的是清理我们的集中式 (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) 我有一个表单位
| 单位名称 |
|---|
| 单元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 ×10
sql-server ×9
alter-table ×1
collation ×1
dynamic-sql ×1
memory-grant ×1
query ×1
recovery ×1
ssms ×1