我需要编写许多具有许多可选过滤参数的 SP。在阅读了 Turgay Sahtiyan(Microsoft 的高级 SQL Server 高级现场工程师)的博客后,他提到了完全相同的问题,解决它的方法是通过动态 SQL。在他的幻灯片中找到它http://blogs.msdn.com/b/turgays/archive/2013/09/07/sqlsaturday-243-cape-town-top-10-performance-tips-for-sql-server-developers .aspx
所以我的问题是这是唯一和最好的方法还是有其他选择?
WHERE (@EmployeeFirstName IS NULL OR emp.First_Name LIKE @EmployeeFirstName )
AND (@EmployeeLastName IS NULL OR emp.Last_Name LIKE @EmployeeLastName )
AND (@EmployeeNetworkLogOn IS NULL OR emp.Network_ID LIKE @EmployeeNetworkLogOn )
AND (@EmployeeStatus IS NULL OR emp.Employee_Status = @EmployeeStatus )
AND (@EmployeeType IS NULL OR emp.Employee_Type = @EmployeeType )
AND (@SupervisorFirstName IS NULL OR sup.First_Name LIKE @SupervisorFirstName )
AND (@SupervisorLastName IS NULL OR sup.Last_Name LIKE @SupervisorLastName )
AND (@SupervisorNetworkLogOn IS NULL OR …Run Code Online (Sandbox Code Playgroud) 我一般是 SQL 新手,所以我在设计的一些存储过程中遇到了一些问题。我的程序接受 3 个参数。位置(或表名基本上是 varchar)、房间号 (varchar) 和 'xxx-xxxx' 形式的电话号码 (char)。这是该过程的代码。
ALTER PROCEDURE [dbo].[AddPhoneNumberToRoom]
@Location varchar(25),
@Room varchar(10),
@PhoneNumber char(8)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @String varchar(100);
SELECT @String = ' UPDATE ' + @Location +
' SET PhoneNumber = ' + @PhoneNumber +
' WHERE Room = ' + @Room;
EXEC(@String);
END
Run Code Online (Sandbox Code Playgroud)
我收到的错误是:
UPDATE 语句与 FOREIGN KEY 约束“FK_Apartments_PhoneNumbers”冲突。冲突发生在数据库“CMPhone”、表“dbo.PhoneNumbers”、列“PhoneNumber”中。
电话号码在 PhoneNumber 表中,所以当我这样做时:
UPDATE Apartments SET PhoneNumber='123-4567' WHERE Room='2'
Run Code Online (Sandbox Code Playgroud)
它工作得很好。该PhoneNumbers表还看起来是这样的,只是在它的一个数字。
PhoneNumber
-----------
123-4567
Run Code Online (Sandbox Code Playgroud) 下面的代码是一个动态 sql,它将为您提供系统中所有警报的列表。
有用。
出于这个问题之外的原因,代码中有一个临时表。
这个问题与我在创建临时表之前确保临时表不存在的方式有关。
我在 try catch 块中放置了一个删除表,如下面的代码所示。
我的问题是:
我仍然有一些服务器 sql-server-2008-r2 但大多数我的服务器是 sql server 2016。
EXEC Sp_executesql
N'
begin try
drop table #tmp_sp_help_alert
end try
begin catch
end catch
create table #tmp_sp_help_alert (
id int null, name nvarchar(128) null,
event_source nvarchar(100) null,
event_category_id int null,
event_id int null,
message_id int null,
severity int null,
enabled tinyint null,
delay_between_responses int null,
last_occurrence_date int null,
last_occurrence_time int null,
last_response_date int null,
last_response_time int null,
notification_message nvarchar(512) null,
include_event_description …Run Code Online (Sandbox Code Playgroud) sql-server dynamic-sql sql-server-2008-r2 error-handling temporary-tables
我有一个包含一些动态 SQL 的存储过程。我正在尝试使用执行存储过程,OPENROWSET但出现错误:
消息 11514,级别 16,状态 1,过程 sp_describe_first_result_set,第 1 行
无法确定元数据,因为语句 'EXEC sp_executesql @SQL, N'@row_count_out INT OUTPUT', @row_count_out = @row_count_table OUTPUT;' 在过程 'nachoTest' 中包含动态 SQL。考虑使用 WITH RESULT SETS 子句来显式描述结果集。
我真正的存储过程有点复杂,但这是错误的一个工作示例:
存储过程:
CREATE PROCEDURE nachoTest @table_name NVARCHAR(MAX)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @row_count_table INT
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = N'SELECT @row_count_out = COUNT(*) FROM ' + @table_name
EXEC sp_executesql @SQL, N'@row_count_out INT OUTPUT', @row_count_out = @row_count_table OUTPUT;
SELECT @row_count_table AS row_count, @table_name AS table_name
END
GO
Run Code Online (Sandbox Code Playgroud)
调用它 …
sql-server stored-procedures dynamic-sql openrowset sql-server-2014
我正在尝试返回重叠多边形的数量。问题是它抱怨我的“$1”标志:
Run Code Online (Sandbox Code Playgroud)Error is "SQL state: 42601", syntax error at "$1".
为什么是这样?我在这里完全是初学者,除了用符号引用参数之外,我无法在网上找到解决方案$。
CREATE OR REPLACE FUNCTION any_overlap (x text)
RETURNS integer AS $$
DECLARE amount INTEGER;
BEGIN
SELECT COUNT(*) INTO amount FROM $1 a
INNER JOIN $1 b ON
(a.polygon && b.polygon AND ST_Relate(a.polygon, b.polygon, '2********'))
WHERE a.ctid != b.ctid;
RETURN amount AS id;
END; $$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud) 尝试执行此脚本仅给出第一个选择结果
declare @sp nvarchar(max)
select @sp = concat(N'select 1 ', replicate('-', 5000), char(13) + char(10), N'select 2')
exec (@sp)
Run Code Online (Sandbox Code Playgroud)
但是当我将连字符降低到 1000 时,我还得到了第二个选择 如何克服这个限制?
我有很多包含一些常见列(相同名称和数据类型)的表。在这些列上,我需要执行相同的操作,我想通过存储过程来执行此操作。但是,我目前可以使其工作的唯一方法是使用动态 sql,我宁愿避免这种情况。
有没有什么方法可以在不使用动态sql的情况下对不同的表(其中表名作为参数传递)使用存储过程?
我以非常模糊的方式提出问题,因为我无法用简短的句子解释我的问题是什么。
一般来说,我有一组转换文本和 XML 的过程。里面的程序,我有很多NVARCHAR和XML变量与表XML列。在我的数据中,我有特殊的字母(例如ò)。当我运行所有代码时,特殊字符消失并显示为?- 这意味着我得到了VARCHAR而不是NVARCHAR.
总的来说,我一切都好,直到最后的步骤。我得到了EXEC哪个调用存储过程具有类型为临时构造的变量NVARCHAR。我有一个包含XML字段的表。在这种情况下,我得到了?. 如果我手动运行程序(不在 中EXEC INTO),我会得到正确的符号。
任何想法为什么会发生这种情况?我检查了所有变量,它们是NVARCHAR.
我正在尝试执行以下语句,该语句创建一个名为 service2019 的数据库:
DECLARE @dbname VARCHAR(50);
SET @dbname = 'service' + CAST(YEAR(GETDATE()) AS VARCHAR(4));
EXEC (
'CREATE DATABASE ' + @dbname + ' ON PRIMARY
( NAME =' + '' + @dbname +'' + ', FILENAME = ''C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQL2014TEST\MSSQL\DATA\''' + '''' + @dbname + '''' + '''.mdf''' + ', SIZE = 10MB , MAXSIZE = UNLIMITED, FILEGROWTH = 100KB )
LOG ON
( NAME =' + '' + @dbname + '_log' + ', FILENAME = ''C:\Program Files\Microsoft SQL …Run Code Online (Sandbox Code Playgroud) sql-server dynamic-sql t-sql sql-server-2014 quoted-identifier
使用以下查询时,我无法从 bnrcno 列中获取数据。
select 'insert into table values('||id||','||bnrcno||','||chargetype||','||domno||','||coa_id||','||liability_gl||','||revenue_gl||','||taxno||')'
from bill_charges_map where domno=5
Run Code Online (Sandbox Code Playgroud)
该brcno列是整数类型,其中的大多数值都为空。
我想使用COPYPostgres 中的函数将数据发送到 .csv 文件。但我使用匿名块,所以我的表名应该是变量的值。
COPY (SELECT cname.portal from user) To '/tmp/out.csv' With CSV;
Run Code Online (Sandbox Code Playgroud)
cname我的匿名块内的变量在哪里。我尝试使用EXECUTE格式,但它也不起作用。我试过类似的东西:
EXECUTE format (' COPY (select * from %s.portal,cname ) To '/tmp/out1.csv' With CSV');
Run Code Online (Sandbox Code Playgroud) 我有一个过程,它在数百个数据库中动态运行查询,这些数据库都具有相同的确切架构,并将结果聚合到临时表中。该查询仅涉及 3 个表(每个表都在数百万行的 10 到 100 之间,但我总共只提取了大约 50,000 行数据)。
在查看查询的汇总 IO 统计信息(通过 StatisticsParser.com - 大声喊出 Richie Rump)时,它显示创建了一个工作表,并且该工作表上有大约 550,000 个 LOB 逻辑读取。查询中所有表的常规逻辑读取总数略低于大约 400,000 次逻辑读取。
查询中的实际表都没有使用任何 LOB 数据类型,那么这到底意味着什么,它是否是我查询中瓶颈的潜在来源?
(顺便说一句,我拉回的 50,000 行数据仅相当于大约 3 MB 的数据,但我的查询在第一次运行时需要大约 10 秒才能运行(例如,当表的数据页仍在加载到内存中时) ),然后在后续运行中不到一半的时间,因此尝试查看我是否可以始终接近 <= 4s 基准测试,以及这些 LOB 逻辑读取是否与之相关。)
更新:这是一个类似的示例查询(再次查看它,我可能会发现 LOB 逻辑读取的来源)。
过程签名: sp_StoredProc_ToGetData (@IdsTable TVP (Id INT), @StartDate DateTime, @EndDate DateTime)
sp_StoredProc_ToGetData 内部的查询:
SELECT Id
INTO #IdsTableTemp
FROM @IdsTable;
-- This query is ran using dynamic SQL but for the example simplicity this is just the root …Run Code Online (Sandbox Code Playgroud) sql-server statistics dynamic-sql sql-server-2016 performance-tuning
dynamic-sql ×12
sql-server ×7
postgresql ×3
plpgsql ×2
t-sql ×2
cast ×1
copy ×1
exec ×1
insert ×1
openrowset ×1
postgis ×1
statistics ×1
syntax ×1
unicode ×1
xml ×1