小编Jus*_*ing的帖子

我可以在没有动态 sql 的情况下使用一个查询查询所有数据库中的存储过程吗

如果我想查询服务器上的所有数据库以查看是否存在存储过程,我可以组合sp_executesql并在类似于以下的查询上运行游标:

SELECT 
     'select ' + '''' + name + '''' + ', name from [' + name 
   + '].sys.procedures WHERE name = ''usp_MyProc'' COLLATE SQL_Latin1_General_CP1_CI_AI ' 
FROM sys.databases 
-- I get a collation error from the following
WHERE name NOT IN ('ReportServer', 'ReportServerTempDb');
Run Code Online (Sandbox Code Playgroud)

我可以在没有动态 sql 和游标的情况下做同样的事情吗?

sql-server stored-procedures

6
推荐指数
2
解决办法
3918
查看次数

在 SQLCLR 中使用系统 message_id 引发错误

如果调用CREATE DATABASE foo两次,我会收到错误消息:

Msg 1801, Level 16, State 3, Line 1
Database 'dropme' already exists. Choose a different database name.
Run Code Online (Sandbox Code Playgroud)

错误消息列在sys.messages 中

SELECT * FROM sys.messages WHERE message_id = 1801 AND language_id = 1033
Run Code Online (Sandbox Code Playgroud)

我有一个 SQLCLR 过程,它基本上可以执行CREATE DATABASE FOR ATTACH. 它一开始就知道创建的数据库的名称,但在附加之前做了很多工作。因此,我想在继续之前确保数据库不存在,如果存在则给出该错误。

如果我尝试在该消息上使用RAISERROR(1801, 16, 1)它不会让我:

Msg 2732, Level 16, State 1, Line 1
Error number 1801 is invalid. The number must be from 13000 through 2147483647 and it cannot be 50000.
Run Code Online (Sandbox Code Playgroud)

除了引发错误并使 msg_id …

sql-server sql-server-2008-r2 error-handling

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

附加缺少 LDF 的 MDF

可能重复:
如何在 SQL Server 中附加数据库?

我得到了一个数据库的 MDF,没有备份,也没有要求我将数据库附加到 SQL 服务器的 LDF。我收到以下错误:

File activation failure. The physical file name "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER2K8\MSSQL\DATA\something.LDF" may be incorrect. The log cannot be rebuilt because there were open transactions/users when the database was shutdown, no checkpoint occurred to the database, or the database was read-only. This error could occur if the transaction log file was manually deleted or lost due to a hardware or environment failure.

我尝试了Paul Randall 的创建相同大小数据库的方法,将其置于紧急单用户模式并尝试以这种方式在线设置。有没有其他选择,或者我告诉给我这个文件的人数据已损坏?

sql-server corruption

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

有没有办法让 sql server 在当前的 SQLCLR 存储过程之前搜索 master 数据库?

对于带有前缀 sp_ 的 T-SQL 存储过程,SQL Server 将在 master 数据库中搜索并使用当前过程之前的过程。对于我使用 Visual Studios 内置部署使用 SQL Server 2010 创建的 SQLCLR 存储过程,情况似乎并非如此。数据库服务器是 SQL Server 2008 R2 (SP1)。

我执行这个脚本:

SELECT name
from master.sys.procedures
WHERE type_desc='CLR_STORED_PROCEDURE' and schema_id = 1

USE tempdb
PRINT 'USING tempDb'
EXEC sp_RAISERROR_CaughtDemo;
GO
USE master
PRINT 'USING master'
EXEC sp_RAISERROR_CaughtDemo
GO
--SELECT * from sys.assembly_modules
Run Code Online (Sandbox Code Playgroud)

并且存储过程只会使用来自 master 数据库的非限定名称执行:

name
----------------------------------
sp_RAISERROR_CaughtDemo
sp_RAISERROR_UncaughtDemo

(2 row(s) affected)

USING tempDb
Msg 2812, Level 16, State 62, Line 5
Could not find stored procedure 'sp_RAISERROR_CaughtDemo'. …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-clr

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

为反向 DNS 查找建议更好的设计模式

我正在处理一个项目,我需要查找与记录发出 HTTP 请求的 IP 地址关联的主机名。查找目前作为日常 ETL 工作的一部分发生。当前的方法是使用标量 CLR 函数(与此类似的代码发布在网络上的许多地方,下面发布了我的修订;我不确定原作者是谁):

using System.Data.SqlTypes;
using System.Net;
using System.Security;
using System.Text.RegularExpressions;
using Microsoft.SqlServer.Server;

public partial class udfn_GetHostName
{

[Microsoft.SqlServer.Server.SqlFunction]
public static string udfn_GetHostname(string IPAddr)
{
    try
    {
        /* 
         Using deprecated method intentionally.
         GetHostEntry() is now recommended.
         But it does some irritating things like returning an error if a PTR
         record points to a name that doesn't have an A record.
        */
        IPHostEntry IpEntry = Dns.GetHostByAddress(IPAddr);
        // Test whether the record returned has at least …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2 dns sql-clr

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

为什么 SqlSentry 计划资源管理器不提供我的查询持续时间?

我在一个 13gig 的数据库中有一个很大的令人讨厌的存储过程,当我包含实际的执行计划时,它需要 45 分钟才能运行。我从 SSMS 保存查询计划并在SQL Sentry Plan Explorer 中打开,我没有看到任何查询的持续时间:

我搜索了整个查询列表并重新搜索了它,整个列都是空的。我知道这个特定存储过程中的一些查询需要很长时间才能运行。虽然存储过程很大,但它不是具有数百万微秒查询的存储过程,而且我知道某些查询需要几分钟才能运行。

performance sql-server-2008-r2 query-performance

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

是否有针对 SSDT 项目的 SQL Server 2008 R2 特定目标?

我正在 Visual Studio 2012 中创建一个 SQLCLR 存储过程。我有这些目标平台的选项:

SSDT 平台 sql server 2005, 2008,.  2012年,蔚蓝

没有 SQL Server 2008 R2 特定选项吗?这是因为 SQL 2008 R2与 SQL Server 2008共享相同的兼容性级别100?

sql-server visual-studio sql-clr

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

我应该执行哪些步骤来准备将 MDF 作为(主要是)只读数据库分发?

我所在的团队开发使用多个 SQL Server 数据库的产品。其中一些大多是只读的。表不会更改,但作为配置应用程序的一种方式,某些视图和存储过程会更改。这些视图缺少索引。它们不是物化视图。对表的更改仅在升级期间发生,并且涉及向客户端发送附加的新 MDF。我应该执行哪些步骤来使这些数据库处于“发货就绪”状态?更新请注意,这些 MDF 中有大量可用空间,因此会收缩,然后重新索引。

我们目前正在做以下工作:

  • 数据库处于简单恢复模式(我们通常建议保留 MDF 的原始副本作为备份)
  • 我们将数据库归为 sa 并删除所有登录名(部署过程添加适当的登录名)
  • 我们DBCC SHRINKDATABASE在数据库上运行
  • 我们运行Ola Hallengren 的完整性和维护脚本

    EXECUTE dbo.DatabaseIntegrityCheck
        @Databases = 'DB_IN_QUESTION',
        @CheckCommands = 'CHECKDB',
        @ExtendedLogicalChecks = 'Y',
        @TabLock = 'Y'
    GO
    
    EXECUTE dbo.IndexOptimize
        @Databases = 'DATABASE_IN_QUESTION',
        @FragmentationLow = NULL,
        @FragmentationMedium = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
        @FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
        @FragmentationLevel1 = 5,
        @FragmentationLevel2 = 30,
        @SortInTempdb = 'Y',
        @MaxDOP = 0
    GO
    
    Run Code Online (Sandbox Code Playgroud)

我们应该为 Ola 的脚本使用其他参数吗?我们是否应该采取任何其他措施?将数据库设为只读会很麻烦,因为视图和存储过程经常由最终用户修改。

vendor-support sql-server

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

如何从链接服务器上的表中删除行

我需要从具有相同架构的多个服务器上的多个数据库中的表中删除行。OPENROWSET()似乎不是答案。

如果我这样做:

SET @sqlStr = '
    SELECT TOP 0 * FROM OPENROWSET(''SQLNCLI'', ''Server=' + @Server + ';Trusted_Connection=yes;'',
        ''DELETE FROM [' + @DBName + '].dbo.tblName WHERE foo='bar') AS a';
EXEC (@sqlStr);
Run Code Online (Sandbox Code Playgroud)

我收到错误

Msg 11525, Level 16, State 1, Procedure sp_describe_first_result_set, Line 1
The metadata could not be determined because statement 'DELETE FROM  . . .
Run Code Online (Sandbox Code Playgroud)

如果我添加SELECT 1;到查询中以便像下面那样返回结果集,我会得到一行一列的结果(顺便说一句,它的值不是“1”)。但是,不会发生删除操作。

SET @sqlStr = '
    SELECT TOP 0 * FROM OPENROWSET(''SQLNCLI'', ''Server=' + @Server + ';Trusted_Connection=yes;'',
        ''SELECT 1; DELETE FROM [' …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql linked-server

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

让 Visual Studio 部署 UDF 以返回 NVARCHAR(MAX)

我在 Visual Studio 2013 中有一个带有以下签名的 SQLCLR 存储过程:

[SqlFunction(DataAccess = DataAccessKind.Read, SystemDataAccess = SystemDataAccessKind.Read)]
public static SqlString ExecSql2Json(SqlString sql)
Run Code Online (Sandbox Code Playgroud)

或者我已经尝试过:

[SqlFunction(DataAccess = DataAccessKind.Read, SystemDataAccess = SystemDataAccessKind.Read)]
public static SqlChar ExecSql2Json(SqlChar sql)
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,参数和返回类型都被定义为NVARCHAR(4000). 我希望他们成为NVARCHAR(MAX)

我知道我可以手动编写自己的CREATE PROCEDURE语句来进行细粒度控制。是否有任何选项可以更改 SQL Server 生成的部署 DDL,或者我是否只需要手动添加脚本来删除和读取具有正确签名的 UDF?

varchar functions sql-clr visual-studio-2013

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

如何在 SQL Server 2008 R2 中按数据库过滤扩展事件

如果我在 SQL Server 2008 R2 中执行这样的扩展事件会话:

CREATE EVENT SESSION [Query tracing] ON SERVER 
ADD EVENT sqlserver.rpc_completed 
    (
        ACTION(sqlserver.sql_text)
        WHERE sqlsever.database_name = 'master'
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

消息 25706,级别 16,状态 8,第 8 行
找不到事件属性或谓词源“sqlsever.database_name”。

同样发生在 WHERE sqlsever.database_id = DB_ID('master')

有没有办法按数据库过滤?

sql-server sql-server-2008-r2 extended-events

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

哪个版本的 AdventureWorks 在 sales.vIndividualCustomer 上有一个名为 CustomerId 的列?

此处SQL Native Client MOF 文件带有 Visual Studio 解决方案,该解决方案可用于查询冒险工作以进行测试。应用程序在编译和运行时执行的第一个查询是

SELECT CustomerID, Title, FirstName, MiddleName, LastName, Suffix,
    Phone, EmailAddress, EmailPromotion, AddressType, AddressLine1, 
    AddressLine2, City, StateProvinceName, PostalCode, 
    CountryRegionName, Demographics
FROM Sales.vIndividualCustomer
Run Code Online (Sandbox Code Playgroud)

这将在 Adventureworks 2008、2012 和 2014 上返回以下错误。

Msg 207, Level 16, State 1, Line 3
Invalid column name 'CustomerID'.
Msg 207, Level 16, State 1, Line 3
Invalid column name 'Phone'.
Run Code Online (Sandbox Code Playgroud)

我今天从 CodePlex 下载了这三个 AdventureWorks 版本。在 2008 年和 2012 年,我下载了一个带有 LDF 和 MDF 的 zip 文件,我通过CREATE DATABASE FOR ATTACH …

sql-server

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

并非所有列都显示在 DB2 for IBM i 上的 select * 上

我的客户在他们的 IBMi 上有一个表,外键指向另一个表。它没有显示一个SELECT * FROM lib.table. 但是,如果我在列列表中特别提及它。它确实出现了。

SELECT
        col1, col2.col3, fxcolid
    FROM  lib.table
Run Code Online (Sandbox Code Playgroud)

我正在使用 jt400 驱动程序从SQLWorkbench/J进行查询。

db2 iseries

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