我只是想知道,在MERGET-SQL 中,您可以输出OUTPUT $action,Inserted.*和Deleted.*记录。我想问我怎么能得到OUTPUT $action,Inserted.*,Deleted.*在SSIS记录?
我们正在使用ENCRYPTBYPASSPHRASE来加密某些数据库的某些列。每次我们需要使用 DECRYPTBYPASSPHRASE 传递密码时,都要解密这些值。
所以我计划创建一个如下所示的存储过程
CREATE function [dbo].[SQLEncrypt](@str varchar(max)) returns varchar(max)
as
begin
declare @test nvarchar(max)
set @test=''
set @test = convert(varchar(MAX),DECRYPTBYPASSPHRASE ('password',@str))
return @test
END
GO
Run Code Online (Sandbox Code Playgroud)
我可以使用如下所示的这个存储过程来解密一列
----usgae---
select master.dbo.SQLEncrypt(columnname) from tablename--
-----------------
Run Code Online (Sandbox Code Playgroud)
现在我打算将此密码全局存储在 SQL 服务器中的某个位置(不知道是否可能),然后在存储过程中使用它。无论如何都可以做到吗?我也可以对用户隐藏密码吗?
我有一个这样的查询:
-- This is inefficient, and may even be wrong if expression is nondeterministic
SELECT TOP 10 team_name,score_points=<big expression>
FROM teams
WHERE <big expression> >= 100
ORDER BY 2 DESC
-- This gives error
SELECT TOP 10 team_name,score_points=<big expression>
FROM teams
WHERE score_points >= 100
ORDER BY 2 DESC
Run Code Online (Sandbox Code Playgroud)
我想要做的很明确:列出得分最高的球队。列出所有得分至少为 100 score_points 的球队,但不超过 10 支球队。
如果我重复这个表达式,它将非常丑陋且效率低下。另外,当我的表达式不确定时,它会给出错误的结果。score_points在WHERE子句中使用名称会出错。有没有一种有效的方法可以让我的表达式的结果既作为查询中的列返回,又用作过滤器?
请不要告诉我有关计算列的信息,我知道它们,但我不能在这里使用它们。
我的示例数据库(实际上是 CTE 语句数据)如下所示:
eventdate val
2012-03-23 3965
2012-03-26 3979
2012-03-27 3974
2012-03-28 3965
2012-03-29 3967
2012-03-30 3959
2012-04-02 3951
2012-04-03 3961
2012-04-04 3944
2012-04-05 3935
2012-04-09 3901
2012-04-10 3822
Run Code Online (Sandbox Code Playgroud)
我想删除差异小于 12 的值。这是我的查询和输出:
SELECT
eventdate,
CASE
WHEN ABS(val - LAG(val) OVER (ORDER BY eventdate)) <= 12
THEN NULL
ELSE val
END AS val
FROM tbl_1
ORDER BY eventdate
Run Code Online (Sandbox Code Playgroud)
输出:
eventdate val
2012-03-23 3965
2012-03-26 3979
2012-03-27 NULL
2012-03-28 NULL
2012-03-29 NULL
2012-03-30 NULL
2012-04-02 NULL
2012-04-03 NULL
2012-04-04 3944
2012-04-05 NULL …Run Code Online (Sandbox Code Playgroud) 我在下面的脚本中遇到以下错误
消息 102,级别 15,状态 1,第 44 行
'?' 附近的语法不正确。消息 319,级别 15,状态 1,第 47 行
关键字“with”附近的语法不正确。如果此语句是公共表表达式、xmlnamespaces 子句或更改跟踪上下文子句,则前一条语句必须以分号终止。
任何人都可以帮助解决这个问题,它似乎也没有围绕每个数据库
DECLARE @command NVARCHAR(MAX)
CREATE TABLE #worktable
(
[Database] SYSNAME
,SchemaName SYSNAME
,ObjectName SYSNAME
,StatsName SYSNAME
,ColName SYSNAME
--,Command VARCHAR(500)
)
exec [master].[sys].sp_MSForEachDB @command1="use [?]"
INSERT INTO #worktable
SELECT
'[?]' AS [Database]
,sch.[name] AS [SchemaName]
--,OBJECT_NAME(o.[object_id],DB_ID(''[?]'')) AS [ObjectName]
,o.[Name] AS [ObjectName]
,s.name AS [StatsName]
,c.name AS [ColName]
--,''COMMAND'' AS [Command]
FROM sys.stats AS s
INNER JOIN sys.stats_columns AS sc
ON s.object_id = sc.object_id …Run Code Online (Sandbox Code Playgroud) 我希望更新READ_ONLY数据库上的几个用户。
由于数据库在全球范围内 24/7 全天候使用,并且维护窗口刚刚过去,我想在活动量低的时刻执行此操作(以便能够遵守截止日期)。
我目前正在考虑使用:
USE MASTER
GO
ALTER DATABASE SQL SET READ_WRITE
GO
USE SQL
GO
EXEC sp_addrolemember N'db_datareader', N'USER'
GO
USE MASTER
GO
ALTER DATABASE SQL SET READ_ONLY
GO
Run Code Online (Sandbox Code Playgroud)
但是我想:
由于我无法将这些命令放入事务中,而且我在 DEV 或 STG 环境中没有方便的应用程序服务器来预先测试更改,是否有任何有关更改read_only单个操作状态的文档?(我确实测试了 T-SQL 语句,并且它们有效)
另外,由于这需要对数据库进行排他锁,我什至有可能通过我的语句吗?
我倾向于只是提出这将不得不等到下一个维护窗口期间。但我希望这里有人能证明我错了。
是否有基于主键合并行的简写?例如:
MERGE INTO [MyDatabase].[MySchema].[MyTable] AS target
USING [MyLinkedServer].[MyDatabase].[MySchema].[MyTable] AS source
-- The following line is pseudocode illustrating what we want to accomplish
ON (target primary key equals source primary key)
WHEN MATCHED THEN
UPDATE SET target.MyColumn = source.MyColumn
WHEN NOT MATCHED BY TARGET THEN
INSERT (MyCol1, MyCol2, MyCol3)
VALUES (source.MyCol1, source.MyCol2, source.MyCol3);
Run Code Online (Sandbox Code Playgroud)
如果主键包含大量列,则写出条件会很乏味。此外,如果主键发生变化,许多连接和合并可能会突然中断。
您可能会问,“为什么主键会改变?” 真实场景:我们被告知一个对象由其专有名称唯一标识。后来,我们发现如果对象移动到另一个子网,专有名称可能会改变。新要求的推出改变了我们唯一标识对象的方式。这在很多地方破坏了产品。如果我们在主键而不是特定列上进行合并,则可以避免一些混乱。
我有一个从显示不同数据的表中选择数据的视图。
表是dbo.user,视图是dbo.users(不要判断,我继承了这个系统)。观点很简单select * from table。
如果我运行以下语句:
SELECT Field1, Field2 FROM dbo.[User] WITH (NOLOCK) ORDER BY Field1;
SELECT Field1, Field2 FROM dbo.Users WITH (NOLOCK) ORDER BY Field1;
Run Code Online (Sandbox Code Playgroud)
我为其中一个字段获得了不同的值。见附图:

任何想法这是如何发生的?该表是聚集的,具有 pk 和唯一索引。
在数据库中的表中定位特定单词并在列表中显示表和列的名称。
有太多表无法定位数据库中的特定单词。
下面是我们在一个有几十亿条记录的表上运行的一些 T-SQL 命令。像这样的 5 个表占用了数据库的大部分大小。在不引起任何问题的情况下执行这些步骤的最快方法是什么?仅运行第一个命令就需要一个多小时。删除整个表并重新创建它会更容易吗?或者,对于这么多数据,这是不可能和安全的吗?谁能想到任何其他想法来加快速度?我们只是试图截断数据,然后在我们的 ETL 过程中从头开始重建表。
DROP INDEX [OF_IDX_ClusteredConcept] ON [dbo].[OBS_FACT] WITH ( ONLINE = OFF )
ALTER TABLE OBS_FACT DROP CONSTRAINT OBS_FACT_PK
ALTER INDEX ALL ON OBS_FACT disable;
-- add new data to OBS_FACT table via ETL process
ALTER TABLE [dbo].[OBS_FACT] ADD CONSTRAINT [OBS_FACT_PK] PRIMARY KEY NONCLUSTERED
(
[ENCOUNTER_NUM] ASC,
[CONCEPT_CD] ASC,
[PROVIDER_ID] ASC,
[START_DATE] ASC,
[MODIFIER_CD] ASC,
[INSTANCE_NUM] ASC
) ON [PRIMARY]
CREATE CLUSTERED INDEX [OF_IDX_ClusteredConcept] ON [dbo].[OBS_FACT]
(
[CONCEPT_CD] ASC
);
-- REBUILD indexes on OBSERVATION_FACT …Run Code Online (Sandbox Code Playgroud) sql-server ×10
t-sql ×10
cursors ×1
drop-table ×1
index ×1
index-tuning ×1
locking ×1
merge ×1
primary-key ×1
recursive ×1
ssis ×1
view ×1