a)我们认为什么是动态sql语句?
是否有任何sql语句可以动态地将子句或子句的一部分添加到SQL字符串中?
b)那么使用动态提供的值占位符的参数化字符串是否也被视为动态sql语句?
感谢名单
我有一个存储过程,它返回我约50列.我想编写一个查询,在那里我将能够从SP返回的列列表中选择一个特定的列.
我试着写select RSA_ID from exec(uspRisksEditSelect '1')但是它给我一个错误.我想我们需要为它编写一些动态的sql.但我是新手.
总之,C#抛出我的"动态SQL生成的更新命令不支持针对不返回任何键列信息的SelectCommand",而问题的表是否有一个主键(身份,因为它是MSSQL).
我的代码如下:
void loaddata()
{
try
{
DS = new DataSet();
sqladapt = new SqlDataAdapter("SELECT servicetag,name,defect,primkey FROM " + Properties.Settings.Default.DBtableLaptops + "", sqlcon);
sqladapt.FillSchema(DS, SchemaType.Source);
sqladapt.Fill(DS);
commandBuilder = new SqlCommandBuilder(sqladapt);
DT = DS.Tables[0];
Laptops_datagridview.DataSource = DT; //I'm using a datagridview to edit the data.
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
void savedata()
{
//Doesn't work yet.
try
{
sqladapt.Update(DS); // <-- Throws the aforementioned error.
sqladapt.Dispose();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); …Run Code Online (Sandbox Code Playgroud) 我正在尝试执行动态sql选择我在使用参数从表中选择的位置.
SELECT null FROM @TableName
Run Code Online (Sandbox Code Playgroud)
但是我收到了错误must declare table variable @TableName.我怀疑这是因为我正在使用变量从表中进行选择.我以前不需要这样做.
List<SqlParameter> sqlParams = new List<SqlParameter>()
{
new SqlParameter("TableName", "testtable"),
new SqlParameter("FieldName", "testfield"),
new SqlParameter("Find", "testfind"),
};
string sqlSelect = "SELECT null FROM @TableName
WHERE @FieldName LIKE '%' + @Find + '%' ";
DataTable dtSelect = SqlHelper.ExecuteDataset(sqlConn, CommandType.Text,
sqlSelect, 30, sqlParams.ToArray()).Tables[0];
//30 = timeout
Run Code Online (Sandbox Code Playgroud)
如何使用动态sql执行上述操作?(请不要存储程序)
在PL/SQL中,您可以使用串联指定IN运算符的值:
v_sql := 'select field1
from table1
where field2 in (' || v_list || ')';
Run Code Online (Sandbox Code Playgroud)
是否可以使用变量执行相同的操作?
v_sql := 'select field1
from table1
where field2 in (:v_list)';
Run Code Online (Sandbox Code Playgroud)
如果是这样,怎么样?
编辑:参考Marcin的答案,我如何从结果表中选择?
declare
cursor c_get_csv_as_tables is
select in_list(food_list) food_list
from emp_food
where emp_type = 'PERM';
cursor c_get_food_list (v_food_table varchar2Table)is
select *
from v_food_table;
begin
for i in c_get_csv_as_tables loop
for j in c_get_food_list(i.food_list) loop
dbms_output.put_line(j.element);
end loop;
end loop;
end;
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
ORA-06550: line 10, column 6:
PL/SQL: ORA-00942: table or view does not exist …Run Code Online (Sandbox Code Playgroud) 我在Postgres中有一个功能:
CREATE OR REPLACE FUNCTION upsert(sql_insert text, sql_update text)
RETURNS integer AS
$BODY$
BEGIN
EXECUTE sql_insert;
RETURN 1;
EXCEPTION WHEN unique_violation THEN
EXECUTE sql_update;
RETURN 2;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION upsert(text, text) OWNER TO dce;
Run Code Online (Sandbox Code Playgroud)
我通常使用此查询来调用该函数:
select upsert(
$$INSERT INTO zz(a, b) VALUES (66, 'hahahaha')$$,
$$UPDATE zz SET a=66, b='hahahaha' WHERE a=66$$
)
Run Code Online (Sandbox Code Playgroud)
有用.不幸的是,我的查询字符串不能包含$$,如下所示:
select upsert(
$$INSERT INTO zz(a, b) VALUES (66, 'ha$$hahaha')$$,
$$UPDATE zz SET a=66, b='hahahaha' WHERE a=66$$
)
Run Code Online (Sandbox Code Playgroud)
我已阅读此 …
我正在使用动态sqlie
DECLARE @searchstring VARCHAR(500)
DECLARE @str VARCHAR(MAX)
SELECT @str = 'SELECT * FROM Table1 WHERE ' + @searchstring
EXECUTE @str
Run Code Online (Sandbox Code Playgroud)
我需要的是我想从动态sql上面选择一个列值来传递不同的SP
让我们说我需要ID列值并将其传递给另一个名为GetAnotherData @Ids的sp.我怎样才能做到这一点?
我有一个plpgslq功能,它做一些数据处理,并想写一个for循环,但我的表名在设计时是不知道的.有没有可能的方法来实现这一目标?以下是我想要实现的示例代码片段:
-- Function: check_data()
-- DROP FUNCTION check_data();
CREATE OR REPLACE FUNCTION check_data()
RETURNS character varying AS
$BODY$declare
dyn_rec record;
tbl_name record;
begin
-- sample dynamic tables
tbl_name := 'cars';
tbl_name := 'trucks';
tbl_name := 'bicycles';
for dyn_rec in select * from format($$s%$$,tbl_name) loop
raise notice 'item is %',dyn_rec.item_no;
end loop;
return 'Processing Ok';
end;$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION check_data()
OWNER TO postgres;
Run Code Online (Sandbox Code Playgroud) 我正在尝试动态分区Postgres中的日志条目.我有53个子表(每周有1个日志条目),并希望使用触发器将INSERT路由到子表.
我运行该函数INSERT INTO log5 VALUES (NEW.*),它的工作原理.
我用EXECUTE语句运行函数,但它失败了.在EXECUTE语句中,它识别NEW为表名而不是传递给触发器函数的变量.有关如何修复的任何想法?谢谢!
错误:
QUERY:INSERT INTO log5 VALUES(NEW.*)
CONTEXT:PL/pgSQL函数log_roll_test()EXECUTE语句中的第6行
错误:缺少表"new"的FROM子句条目SQL状态:42P01
我的功能:
CREATE FUNCTION log_roll_test() RETURNS trigger AS $body$
DECLARE t text;
BEGIN
t := 'log' || extract(week FROM NEW.updt_ts); --child table name
--INSERT INTO log5 VALUES (NEW.*);
EXECUTE format('INSERT INTO %I VALUES (NEW.*);', t);
RETURN NULL;
END;
$body$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
我的触发器:
CREATE TRIGGER log_roll_test
BEFORE INSERT ON log FOR EACH ROW
EXECUTE PROCEDURE log_roll_test();
Run Code Online (Sandbox Code Playgroud) 我在postgresql(版本9.4.4)中有一个相当复杂的功能,我需要一些帮助.
我在我的函数中声明了一个循环(下面有大量工作):
CREATE OR REPLACE function getRSI(
psymbol varchar,
pstarttime timestamp with time zone,
pendtime timestamp with time zone,
pduration double precision,
ptable varchar
)
RETURNS SETOF rsi AS
$BODY$
declare
row_data record;
-- some variables
begin
FOR row_data IN SELECT datetime, value FROM "4" WHERE symbol = 'AAPL'
AND datetime BETWEEN '2015-11-23 09:30:00 -0500' AND
'2015-11-23 15:59:59-0500' LOOP
-- enter code here
END LOOP;
end
$BODY$ LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud)
这很完美,我可以得到我的功能的结果,并让它为我的所有数字.
我想让循环像这样工作:
FOR row_data in select datetime, value from quote_ident(ptable)
where …Run Code Online (Sandbox Code Playgroud)