是否可以创建一个存储过程,在与存储过程本身所在的数据库不同的数据库中创建表触发器 (DDL) 。数据库位于同一服务器实例上。如果是,那么如何?
例如,这不起作用:
create PROCEDURE [dbo].[CreateTriggrer]
@db varchar(60)
AS
BEGIN
SET NOCOUNT ON;
declare @statement nvarchar(max) = N'CREATE TRIGGER [dbo].[TestTrigger]
ON [$database$].[dbo].[TestTable]
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
PRINT ''test''
END'
set @statement = REPLACE(@statement,'$database$',@db)
EXEC dbo.sp_executesql @statement = @statement
END
Run Code Online (Sandbox Code Playgroud)
当这样调用时:
EXEC [dbo].[CreateTriggrer] @db = N'TestDatabase'
Run Code Online (Sandbox Code Playgroud)
它返回此错误:
消息 2108,级别 15,状态 1,过程 TestTrigger,第 6 行
无法在“TestDatabase.dbo.TestTable”上创建触发器,因为目标不在当前数据库中。
这是公平的。有没有办法实现我想要的?
我在 SQL SERVER 2008 上,
我想为特定用户启用 SQL 代理,该用户只有对数据库的读取访问权限。我不想给 sysadmin 角色?
有什么办法,我可以做到吗?
我在表中有一个字符串列,将数据显示为 "CXL P/D 08/15/13"
我正在尝试将此列转换为日期时间,但我无法弄清楚如何仅提取日期并更改数据类型。
Cast(RIGHT(RTRIM(Trade_Date) ,8)as datetime) 我正在尝试这个声明,但它不起作用
从字符串转换日期和/或时间时转换失败。
谢谢
我正在尝试链接 2 个 SQL Server(2008 和 2005)。我已经通过 GUI 和脚本尝试过它,但没有运气。我在尝试通过访问进行查询时遇到问题。由于我不是网络管理员,我正在努力研究如何在这方面取得成功,但我总是收到一条消息,告诉我用户“../匿名登录”不允许连接。
经过一些研究,我相信这是一个与 Kerberos 相关的问题,它没有将我的凭据传输到我尝试链接的机器上。我正在使用 NT 身份验证,我无法使用/创建 SQL 身份验证登录。
我已经给我的网络管理员发送了一封邮件,看看我们是否能够在这里使用 Kerberos 委派。
找出我的配置发生了什么以及为什么这不起作用的后续步骤是什么?
提前致谢,因为这是我的第一个问题,大家好!
sql-server-2005 sql-server-2008 distributed-databases kerberos
我在启动 SQL Server 2008 时遇到问题。我需要将数据库从一台计算机复制到 seced。我只DATA从我实际工作的服务器复制目录,然后将此目录复制到我新安装的 SQL Server 2008。在此之后,当我启动 SQL Server 时,它不会启动。
我的错误日志是:
2014-01-02 11:54:18.02 Server Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (X64)
Jul 9 2008 14:17:44
Copyright (c) 1988-2008 Microsoft Corporation
Express Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
2014-01-02 11:54:18.02 Server (c) 2005 Microsoft Corporation.
2014-01-02 11:54:18.02 Server All rights reserved.
2014-01-02 11:54:18.02 Server Server process ID is 6684.
2014-01-02 11:54:18.02 Server System Manufacturer: 'Hewlett-Packard', System Model: 'HP ENVY Sleekbook 4 PC'. …Run Code Online (Sandbox Code Playgroud) 我有一张具有以下结构的表,如您所见,有一个聚集索引和两个非聚集索引,一个非聚集索引是 IX_ParentId_Include,另一个是 FLIX_ParentId_Include
除了第二个索引被过滤之外,它们是相同的。
CREATE TABLE [dbo].[PhotoRepo] (
[PhotoRepoId] INT IDENTITY (1, 1) NOT FOR REPLICATION NOT NULL,
[TypeId] TINYINT NULL,
[ParentId] INT NULL,
[RemoteLocation] VARCHAR (4000) NOT NULL,
[UploadedAt] DATETIME NOT NULL,
[UploadedBy] VARCHAR (255) NULL,
[FileSize] INT NOT NULL,
[DefaultChild] BIT NOT NULL,
[RemoteLocationUploadedAt] DATETIME NULL,
CONSTRAINT [PK_FileList] PRIMARY KEY NONCLUSTERED ([PhotoRepoId] ASC)
);
GO
CREATE CLUSTERED INDEX [IX_PhotoRepoId]
ON [dbo].[PhotoRepo]([PhotoRepoId] ASC);
GO
CREATE NONCLUSTERED INDEX [IX_ParentId_Include]
ON [dbo].[PhotoRepo]([ParentId] ASC)
INCLUDE([RemoteLocation], [DefaultChild], [TypeId]);
GO
CREATE NONCLUSTERED INDEX [FLIX_ParentId_Include] …Run Code Online (Sandbox Code Playgroud) 前几个月的 SQL 盒已经崩溃。我们几乎已经恢复了一些工具并在其上顺利运行应用程序的数据库。但是当我当时尝试备份数据库时,它给出了如下错误,
传递给数据库“****”中的日志扫描的日志扫描编号 (3533468:412:0) 无效。此错误可能表示数据损坏或日志文件 (.ldf) 与数据文件 (.mdf) 不匹配。如果在复制期间发生此错误,请重新创建发布。否则,如果问题导致启动失败,请从备份中恢复。(Microsoft SQL Server,错误:9003)
有人会帮助我摆脱这种情况吗?
我什至尝试复制数据库,但我失败了。
提前致谢。
禁用约束后,我删除了 20 个表中的所有行,使用存储的 proc SP_MsForEachTable 触发。现在在导入之前,我需要重新设置所有标识列以从 1 开始自动编号。
所以我创建了一个存储过程,将表名作为参数传递,因为这似乎需要时间单独执行,是否有另一种方法可以一次对所有表执行此操作?
CREATE PROCEDURE [dbo].[USP_ReseedID]
@table_name varchar(50)
AS
BEGIN
DBCC CHECKIDENT ( @table_name, RESEED, 0)
END
Run Code Online (Sandbox Code Playgroud) 这是我之前问题的一部分。
我有以下逻辑从表中的列中拆分字符串值tblProjects,如下所示:
SELECT @Docs = Documents FROM tblProjects WHERE ID = @ID
SET @Docs = @Docs + '$'
SET @pos = 0
SET @len = 0
WHILE CHARINDEX('$', @Docs, @pos + 1)>0
BEGIN
SET @len = CHARINDEX('$', @Docs, @pos + 1) - @pos
SET @value = SUBSTRING(@Docs, @pos, @len)
IF CHARINDEX('|', @value) >0
BEGIN
SELECT @type = SUBSTRING(@value, 1, CHARINDEX('|', @value) - 1),
@name = SUBSTRING(@value, CHARINDEX('|', @value) + 1, 200)
INSERT INTO tblDocuments VALUES(@ID, @value, …Run Code Online (Sandbox Code Playgroud) 我有一个带有 REAL 类型列的简单表。
表中有 2 行,值分别为 0.23 和 0.24。如果我运行以下命令:
SELECT AVG(MyColumn) FROM dbo.MyTable
Run Code Online (Sandbox Code Playgroud)
我希望得到 0.235 的结果,但实际上我得到 0.2349999901234。
有人可以告诉我为什么吗?
sql-server-2008 ×10
sql-server ×7
corruption ×1
ddl ×1
functions ×1
identity ×1
kerberos ×1
optimization ×1
startup ×1
substring ×1
users ×1