标签: dynamic-sql

从PL/pgSQL函数返回包含未知列的动态表

我需要创建一个函数,检查给定的表是否infowindow存在该字段.如果它存在,则函数必须返回select * from table但如果不存在,则必须返回一个附加id字段:

CREATE OR REPLACE FUNCTION getxo_ocx_cincu_preparar_infowindow(
                                              guretabla character varying)
  RETURNS TABLE AS
$BODY$ 
DECLARE
    tabla ALIAS FOR $1;

BEGIN

IF  EXISTS (SELECT 1
   FROM   pg_namespace n
   JOIN   pg_class     c ON c.relnamespace = n.oid
   JOIN   pg_attribute a ON a.attrelid = c.oid 
   WHERE  n.nspname = current_schema()  -- default to current schema
   AND    c.relname = tabla
   AND    a.attname = 'infowindow'
   AND    NOT a.attisdropped)
THEN
    RETURN QUERY EXECUTE 'SELECT * from ' ||tabla ;
ELSE …
Run Code Online (Sandbox Code Playgroud)

postgresql polymorphism return-type dynamic-sql plpgsql

13
推荐指数
1
解决办法
1万
查看次数

是否可以使用带参数的sp_executesql发出CREATE语句?

我正在尝试动态创建触发器,但在使用sp_executesql参数并将参数传递到动态SQL时遇到了一个令人困惑的问题.以下简单测试用例有效:

DECLARE @tableName sysname = 'MyTable';
DECLARE @sql nvarchar(max) = N'
    CREATE TRIGGER TR_' + @tableName + N' ON ' + @tableName + N' FOR INSERT
        AS
        BEGIN
            PRINT 1
        END';
EXEC sp_executesql @sql
Run Code Online (Sandbox Code Playgroud)

但是,我希望能够@tableName在脚本中使用(和其他值)作为变量,因此我将其传递给sp_executesql调用:

DECLARE @tableName sysname = 'ContentItems';
DECLARE @sql nvarchar(max) = N'
    CREATE TRIGGER TR_' + @tableName + N' ON ' + @tableName + N' FOR INSERT
        AS
        BEGIN
            PRINT @tableName
        END';
EXEC sp_executesql @sql, N'@tableName sysname', @tableName=@tableName
Run Code Online (Sandbox Code Playgroud)

运行上面的代码时,我收到一个错误:

Msg 156,Level …

sql-server dynamic-sql sp-executesql

13
推荐指数
1
解决办法
428
查看次数

什么是动态SQL查询,何时我想使用它?

什么是动态SQL查询,何时我想使用它?我正在使用SQL Server 2005.

sql sql-server-2005 dynamic-sql

12
推荐指数
1
解决办法
7770
查看次数

使用动态变量名创建SQL表

我想使用变量名创建备份SQL表.

一些东西

DECLARE @SQLTable Varchar(20) 
SET @SQLTable = 'SomeTableName' + ' ' + '20100526' 
SELECT * INTO quotename(@SQLTable)
 FROM SomeTableName
Run Code Online (Sandbox Code Playgroud)

但我得到了

'@SQLTable'附近的语法不正确.

它只是维护小脚本的一部分,所以我不必担心注射.

sql t-sql database sql-server dynamic-sql

12
推荐指数
3
解决办法
3万
查看次数

删除重复的子查询

我有一个复杂的SQL查询,可以简化到下面:

Select ColA,ColB,ColC,ColD
From MyTable
Where (ColA In (Select ItemID From Items Where ItemName like '%xxx%') 
    or ColB In (Select ItemID From Items Where ItemName like '%xxx%'))
Run Code Online (Sandbox Code Playgroud)

如您所见,子查询出现两次.编译器是否足够智能来检测它并仅获取子查询的结果一次?或者子查询运行两次?

仅供参考,表项目大约有20,000行,MyTable有大约200,000行.

是否有另一种方法来重写此SQL语句,以便子查询只出现/运行一次?

更新:主查询中的Where子句是动态的,仅在需要时添加(即仅在用户搜索"xxx"时).因此,不可能对主select语句进行更改或重新构造查询.

sql t-sql sql-server dynamic-sql common-table-expression

12
推荐指数
1
解决办法
2155
查看次数

Oracle EXECUTE IMMEDIATE可以使用可变数量的绑定吗?

我需要在Oracle上使用动态SQL执行,我不知道在运行时之前SQL中使用的绑定变量的确切数量.

有没有办法在调用中以EXECUTE IMMEDIATE某种方式使用可变数量的绑定变量?

更具体地说,我需要将一个参数传递给未知的SQL,但我不知道它将在那里使用的频率.

我试过类似的东西

EXECUTE IMMEDIATE 'SELECT SYSDATE FROM DUAL WHERE :var = :var' USING 1;
Run Code Online (Sandbox Code Playgroud)

但它退缩了 ORA-01008: not all variables bound.

oracle plsql dynamic-sql

11
推荐指数
2
解决办法
3万
查看次数

动态SQL(EXECUTE)作为IF语句的条件

我想执行一个动态SQL语句,其返回值是IF语句的条件:

IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN
Run Code Online (Sandbox Code Playgroud)

这会产生错误ERROR: type "execute" does not exist.

是否可以这样做,或者是否有必要在IF语句之前执行SQL变量,然后将变量检查为条件?

postgresql dynamic-sql plpgsql

11
推荐指数
2
解决办法
3万
查看次数

ORA-01747:user.table.column,table.column或列规范无效

在循环中调用execute immediate时获取上述错误

Update CustomersPriceGroups set  1AO00=:disc  Where cuno=:cuno
    Parameters:   disc=66 cuno=000974
Update CustomersPriceGroups set  1AP00=:disc  Where cuno=:cuno
    Parameters:   disc=70.5 cuno=000974
Update CustomersPriceGroups set  1AQ00=:disc  Where cuno=:cuno
    Parameters:   disc=66 cuno=000974
Update CustomersPriceGroups set  1ZA00=:disc  Where cuno=:cuno
    Parameters:   disc=60 cuno=000974
Run Code Online (Sandbox Code Playgroud)

这是什么意思 ?

这是代码片段

    c:=PriceWorx.frcPriceListCustomers('020','221');
LOOP
  fetch c into comno,cuno,nama,cpls;
  exit when c%notfound;
  dbms_output.put_Line(cuno);
   g:=priceWorx.frcPriceListItemGroups('020','221');
   d:=priceworx.frcCustomerDiscounts('020','221',cuno);
  loop
    fetch g into comno,cpgs,n;
    fetch d into comno,cpls,cuno,cpgs,stdt,tdat,qanp,disc,src;
    --dbms_output.put(chr(9)||cpgs);
    sQ:='Update saap.CustomersPriceGroups set "'|| trim(cpgs)||'"=:disc '
       || ' Where cuno=:cuno';
    execute immediate sQ using disc,cuno; 
    commit;
    dbms_output.put_line( …
Run Code Online (Sandbox Code Playgroud)

oracle plsql dynamic-sql

11
推荐指数
4
解决办法
11万
查看次数

在.NET中的动态SQL中清理表/列名称?(防止SQL注入攻击)

我正在生成一些动态SQL,并希望确保我的代码是安全的SQL注入.

为了争论,这里是一个如何生成它的最小例子:

var sql = string.Format("INSERT INTO {0} ({1}) VALUES (@value)",
    tableName, columnName);
Run Code Online (Sandbox Code Playgroud)

在上面,tableNamecolumnName,以及@value来自不受信任来源的任何内容.由于占位符的使用@value是安全的SQL注入攻击,可以忽略.(该命令通过SqlCommand执行.)

但是,tableName并且columnName 不能作为占位符绑定,因此容易受到注入攻击.由于这是一个"真正动态"的场景,因此没有白名单tableNamecolumnName可用.

问题是:

是否有一个标准的,内置的方式来检查和/或消毒tableNamecolumnName?(SqlConnection,或帮助程序类等)如果没有,在使用第三方库的情况下执行此任务的好方法是什么?

笔记:

  • 所有SQL标识符,包括模式,都应该被接受:例如[schema].[My Table].column,就像"安全"一样table1.
  • 可以清理标识符或检测无效标识符.(它不需要确保表/列在上下文中实际有效;生成的SQL可能无效,但必须是"安全的".)

更新:

刚发现这个,并认为它有点有趣:.NET4中有一个SqlFunctions.QuoteName函数(EF4?).好的,这对我来说真的没有帮助......

.net sql sanitization sqlconnection dynamic-sql

11
推荐指数
2
解决办法
4929
查看次数

从PostgreSQL函数返回SETOF行

我有一种情况,我想在两个视图之间返回连接.那是很多专栏.在sql server中很容易.但是在PostgreSQL中我加入时.我收到错误"需要列定义列表".

有什么方法可以绕过这个,我不想提供返回列的定义.

CREATE OR REPLACE FUNCTION functionA(username character varying DEFAULT ''::character varying, databaseobject character varying DEFAULT ''::character varying)
  RETURNS SETOF ???? AS
$BODY$
Declare 
SqlString varchar(4000) = '';
BEGIN
IF(UserName = '*') THEN
   Begin
   SqlString  := 'select * from view1 left join ' + databaseobject  + ' as view2 on view1.id = view2.id';
   End;
ELSE
    Begin
    SqlString := 'select * from view3 left join ' + databaseobject  + ' as view2 on view3.id = view2.id';
    End;
END IF; 
execute …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql plpgsql postgresql-9.2

11
推荐指数
1
解决办法
3万
查看次数