如果我想查询服务器上的所有数据库以查看是否存在存储过程,我可以组合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 和游标的情况下做同样的事情吗?
如果调用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 中附加数据库?
我得到了一个数据库的 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 的创建相同大小数据库的方法,将其置于紧急单用户模式并尝试以这种方式在线设置。有没有其他选择,或者我告诉给我这个文件的人数据已损坏?
对于带有前缀 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) 我正在处理一个项目,我需要查找与记录发出 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) 我在一个 13gig 的数据库中有一个很大的令人讨厌的存储过程,当我包含实际的执行计划时,它需要 45 分钟才能运行。我从 SSMS 保存查询计划并在SQL Sentry Plan Explorer 中打开,我没有看到任何查询的持续时间:

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

没有 SQL Server 2008 R2 特定选项吗?这是因为 SQL 2008 R2与 SQL Server 2008共享相同的兼容性级别100?
我所在的团队开发使用多个 SQL Server 数据库的产品。其中一些大多是只读的。表不会更改,但作为配置应用程序的一种方式,某些视图和存储过程会更改。这些视图缺少索引。它们不是物化视图。对表的更改仅在升级期间发生,并且涉及向客户端发送附加的新 MDF。我应该执行哪些步骤来使这些数据库处于“发货就绪”状态?更新请注意,这些 MDF 中有大量可用空间,因此会收缩,然后重新索引。
我们目前正在做以下工作:
DBCC SHRINKDATABASE在数据库上运行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 的脚本使用其他参数吗?我们是否应该采取任何其他措施?将数据库设为只读会很麻烦,因为视图和存储过程经常由最终用户修改。
我需要从具有相同架构的多个服务器上的多个数据库中的表中删除行。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) 我在 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?
如果我在 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 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 …
我的客户在他们的 IBMi 上有一个表,外键指向另一个表。它没有显示一个SELECT * FROM lib.table. 但是,如果我在列列表中特别提及它。它确实出现了。
SELECT
col1, col2.col3, fxcolid
FROM lib.table
Run Code Online (Sandbox Code Playgroud)
我正在使用 jt400 驱动程序从SQLWorkbench/J进行查询。
sql-server ×10
sql-clr ×4
corruption ×1
db2 ×1
dns ×1
functions ×1
iseries ×1
performance ×1
t-sql ×1
varchar ×1