假设我有以下程序
CREATE PROCEDURE foo (table1_id IN TABLE1.table1_id%type,
table1_val IN TABLE1.table1_value%type)
AS
SQL_UPDATE VARCHAR2(500) := 'UPDATE TABLE1 SET table1_value =:1 WHERE table1_id = :2';
BEGIN
--.....
--1 :
EXECUTE IMMEDIATE SQL_UPDATE USING foo.table1_val, foo.table1_id;
--2 :
UPDATE TABLE1 SET table1_value = foo.table1_val WHERE table1_id = foo.table1_id;
END;
Run Code Online (Sandbox Code Playgroud)
除了样式/可读性之外,在这种情况下(我的意思是绝对可以避免的情况)使用动态查询 (1) 与 (2) 相比是否有任何性能损失?
谢谢你。
我正在使用 PostgreSSQL 8.3。
我想执行这个查询:
select COALESCE(col_fr,col,'Unknown') from my_table where id = 'abc';
Run Code Online (Sandbox Code Playgroud)
故事中的扭曲是列名colum_fr应该动态生成。my_table对于不同的语言有不同的列。就像是:
id col col_ja col_fr
Run Code Online (Sandbox Code Playgroud)
我在水晶报告中使用此查询,我可以在其中传递语言的字符串参数:
select COALESCE(col_||{?parameter},col,'Unknown') from my_table where id = 'abc';
Run Code Online (Sandbox Code Playgroud)
如果{?language}value 是,它将在内部转换为如下内容fr:
select COALESCE(col_||'fr',col,'Unknown') from my_table where id = 'abc';
Run Code Online (Sandbox Code Playgroud)
这永远不会奏效。
我不想使用选择大小写,使其动态化。
作为替代解决方案,我还尝试创建一个存储过程:
CREATE OR REPLACE FUNCTION get_policy_name (
id text,
lang text,
def_value text
)
RETURNS SETOF record AS
$body$
DECLARE
sql text;
BEGIN
sql := 'SELECT COALESCE(col_'||quote_ident(lang)||',col,'||quote_literal(def_value)||')FROM my_table WHERE id ='||quote_literal(id);
RETURN QUERY EXECUTE …Run Code Online (Sandbox Code Playgroud) postgresql stored-procedures dynamic-sql plpgsql postgresql-8.3
我有一个模式(称为import),其中数据作为表导入,以及一个处理它们的函数。之后我想将这些表移到另一个模式中(称为data_archive)中。现有功能运行良好,但我找不到更改架构的方法;这是我编写的一个函数:
我的想法是根据selecta 为该管理制作的表格提供的标准创建表格列表,然后遍历此列表并执行以下操作Alter table xxxx SET schema data_archive:
CREATE OR REPLACE FUNCTION archive_datasets()
RETURNS VOID AS
$BODY$
DECLARE
table_rec record;
BEGIN
FOR table_rec IN
SELECT t.table_name
FROM information_schema.tables AS t
WHERE table_schema = 'import'
AND quote_ident(t.table_name) IN (
SELECT "table_name"
FROM data_sets
WHERE status IN ('Processed', 'Archived', 'Deleted')
)
LOOP
ALTER TABLE quote_ident(table_rec.table_name) SET schema data_archived;
END LOOP;
END;
$BODY$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
但我收到此错误消息:
Run Code Online (Sandbox Code Playgroud)ERROR: syntax error at or near "(" LINE 28: …
SQL 中的一个业务流程可以为每个操作生成一个变量1-N 次调用存储过程,其目的是插入与主流程相关的数据。
如何从选择执行多行生成的 sql 或者有没有办法从选择调用存储过程?
这一步之前的过程是涉及到业务逻辑和数据驱动的操作,对相关的FK连接表做了后续的插入。
在需要调用存储过程的那一点上,它已经准备好在表变量中处理数据。调用存储过程的步骤(过程中的逻辑)是一个涉及过程,在存储过程中是有意义的,并且不能复制到现有过程中。
由Select.
SELECT 'EXEC [sim].[ROI_Save] ' + CONVERT(varchar(6), VSL.PathId) + ', '
+ Convert(varchar(6), @ROIResultId) + ', '
+ CONVERT(varchar(6), RT.routeTypeResultId) + ', '
+ CONVERT(varchar(6), RT.ROI_RouteTypeId) + '; '
FROM @routeResultIds RT
JOIN sim.ROI_Result_Vehicle VSL ON RT.ROI_Result_VehicleId = VSL.ROI_Result_VehicleId
Run Code Online (Sandbox Code Playgroud)
结果
是否连接结果并调用Exec?
设想:
Table1 的字段名称命名为 testtable
ID、名称、大小、宽度、高度
Table2 的字段名称命名为 errortable
id,desc,field1,field2,operator
errortable 的值
+----+-------------------------------------+--------+--------+----------+
| id | desc | field1 | field2 | operator |
+----+-------------------------------------+--------+--------+----------+
| 1 | size should not greater than width | size | width | > |
| 2 | size should not greater than height | size | height | > |
| 3 | with should be equal to height | width | height | <> |
+----+-------------------------------------+--------+--------+----------+
Run Code Online (Sandbox Code Playgroud)
现在我想检查testtable:
我有以下脚本,运行时给我一个逗号分隔的数据库名称列表。
SET NOCOUNT ON
declare @db_list NVARCHAR(MAX)
DECLARE @command varchar(1000)
SELECT @COMMAND = 'SELECT DB_NAME()'
SELECT @db_list = STUFF((
SELECT ', ' + name FROM sys.databases
WHERE name like '__Order'
FOR XML PATH(''),
TYPE).value('.[1]', 'nvarchar(max)'), 1, 2, '')
-- in case there are no DBs to show, then show no DB '***'
select @db_list = COALESCE(@db_list,'***')
SELECT @db_list = RTRIM(LTRIM(REPLACE(@DB_LIST,',', ',''')))
select @db_list
Run Code Online (Sandbox Code Playgroud)
这给了我以下结果:
UKOrder,' ATOrder,' AUOrder
Run Code Online (Sandbox Code Playgroud)
1)这给出了错误的结果集,我希望它是
'UKOrder','ATOrder','AUOrder'
Run Code Online (Sandbox Code Playgroud)
2) 如何将@db_list 传递给 sp_MSforeachdb?
假设我想跑
选择 db_name()
在@db_list 中的每个数据库中
英国订单
订单 …
sql-server dynamic-sql sql-server-2008-r2 sql-server-2012 sql-server-2014
我必须进行动态查询,它使用 oracle pl/sql 中的本机动态 sql 动态绑定列名和表名。
这是我的第一次尝试:
declare
komenda varchar2(255);
v1 varchar2(10):='id_osrodek';
v2 varchar2(10):='nazwa_o';
v3 varchar2(10):='osrodki';
begin
komenda := 'select distinct e.id_student, e.przedmiot, e.:1, o.:2 from egzaminy e
inner join :3 o on o.:4 = e.:5
inner join przedmioty p on e.id_przedmiot = p.id_przedmiot';
execute immediate komenda using v1, v2, v3, v1, v1;
end;
Run Code Online (Sandbox Code Playgroud)
第二:
declare
komenda varchar2(255);
v1 varchar2(10):='id_osrodek';
v2 varchar2(10):='nazwa_o';
v3 varchar2(10):='osrodki';
begin
komenda := 'select distinct e.id_student, p.nazwa_p, e.' || v1 || ', o.' || v2 || …Run Code Online (Sandbox Code Playgroud) 我面前有一个有趣的问题。有一个数据库有大约 100 万个用户帐户,预计每年增长 1-200 万个。该数据库是强 TPT,但此特定查询和所涉及的表不涉及任何 TPT 内容。
当指定第二个数据点(即电子邮件地址和姓氏、公司等)时,sproc 和视图的当前设计需要大约 15 秒来执行 (x2)。该数据库是 SQL Azure P11,但它不是 DTU 绑定查询,升级到最高可用产品 (P15) 对结果没有影响。
下面是 sproc、视图和执行计划。在过去 24 小时内重建或重组了所有索引,并更新了所有统计信息。例如,在查看数据时,历史电子邮件地址 (1..N) 的概念目前正在使用 aCROSS APPLY来获取最新的,这可以防止索引视图,可以通过简单地连接历史电子邮件地址和持久化来解决它们在一个列中。
许多数据库在 nvarchar(4000-max) 列中使用 JSON,所有这些列都有一个公开值并启用索引的计算列。范式必须支持分页,我正在寻找有关如何优化它的反馈/建议。
在这一点上,更改表结构不是一个可行的选择,尽管我可以通过一点点操作看到前进的道路。有没有人对我应该首先看哪里有任何想法?我已经对未知的重新编译和优化进行了测试,以查看是否有任何影响,如果有,则可以忽略不计。
注意:一些业务逻辑(专有列名被删除或修改,sproc和view不能按原样执行,但在功能上与源相同。
CREATE PROCEDURE [dbo].[spGetUserDetailsDynamic] @JsonFilter NVARCHAR(MAX)
AS /* Page number*/
DECLARE @Page AS INT = JSON_VALUE(@JsonFilter, '$.requestPaging.page');
/* Number of records on the page*/
DECLARE @Size AS INT = JSON_VALUE(@JsonFilter, '$.requestPaging.size');
IF (@Page = -1)
SET @Page = 1;
IF (@Size …Run Code Online (Sandbox Code Playgroud) performance sql-server dynamic-sql azure-sql-database query-performance
我将如何引用类型名称以防止 SQL 注入。例如,拿这个
SELECT FORMAT('SELECT CAST(%L AS %s);', '5.42', 'int');
^ Quote this
Run Code Online (Sandbox Code Playgroud)
这很好用,但如果'int'相反,''int); DROP DATABASE foo;SELECT ('你会遇到一些问题,
SELECT FORMAT('SELECT CAST(%L AS %s);', '5.42', 'int); DROP DATABASE foo;SELECT (');
format
----------------------------------------------------------
SELECT CAST('5.42' AS int); DROP DATABASE foo;SELECT ();
(1 row)
Run Code Online (Sandbox Code Playgroud)
我将如何使用动态 SQL 安全地转换为运行时提供的类型?如果我使用%I而不是%s我得到一个标识符(用 安全引用",但类型名称不是标识符并且不能使用双引号)。
我想将代码放在一行中,该行将创建一个包含换行符的存储过程。
dynamic-sql ×10
postgresql ×4
sql-server ×4
plpgsql ×3
oracle ×2
t-sql ×2
alter-table ×1
datatypes ×1
functions ×1
mysql ×1
performance ×1