最近我们对我们的数据库使用了一个 sql 代码审查工具。建议使用SP_EXECUTESQL
代替EXEC
.
我知道SP_EXECUTESQL
可以帮助我们避免 sql 注入。使用EXEC
vs时性能有什么不同吗SP_EXECUTESQL
?
performance sql-server dynamic-sql t-sql exec query-performance
这似乎是一个基本问题,但我找不到任何答案 - 我需要能够从链接服务器获取服务器名称/实例等。我尝试了几件事:
select <linked server>.@@SERVERNAME;
select <linked server>.SERVERPROPERTY('ServerName');
Run Code Online (Sandbox Code Playgroud)
......但没有快乐。有任何想法吗?
这是SQL 2008 R2
& 2014
(2008R2
是链接服务器)
编辑:错误是:
消息 102,级别 15,状态 1,第 2 行“@@SERVERNAME”附近的语法不正确。
我正在开发一个数据仓库。我们每晚刷新的一个临时表有大约 1000 万行。我们正在使用自定义构建的 ETL 工具,我无法对其进行太多更改。该工具像这样加载这个临时表:
truncate stage_table;
insert into stage_table with (tablockx) (column1, column2, etc...)
exec load_stage_table @batch_id = @batch_input
Run Code Online (Sandbox Code Playgroud)
的内容load_stage_table
有一些设置和选择语句。我无法分享确切的代码,但这是一个基本示例。
create table load_stage_table
(
@batch_id varchar(max) = null
)
as
-- <update batch_id in batch_table>
-- collect data
select
column1 = table1.column1,
column2 = table2.column2,
...
from table1
join table2
on table2.id = table1.table2_id
-- many more similar joins
Run Code Online (Sandbox Code Playgroud)
问题是,当我按照 ETL 工具运行的方式运行存储过程时,运行时间几乎是 30 分钟。但是,如果我修改存储过程以在内部包含插入语句,则只需 1 分钟。
create table load_stage_table
(
@batch_id varchar(max) = null
)
as
-- …
Run Code Online (Sandbox Code Playgroud) performance sql-server insert sql-server-2016 exec query-performance
尝试执行此脚本仅给出第一个选择结果
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 时,我还得到了第二个选择 如何克服这个限制?