标签: dynamic-sql

如何选择列作为行?

所以,我一直在寻找,我发现了与我的问题相似的东西,但我需要更多的帮助来获得真正的解决方案.

我正在尝试构造一个返回2列数据的查询,第一列应该是列名本身的列表,第二列应该是该列的值.

在视觉上它看起来像这样

Column1      Column2
-------      -------
columnA      value_of_columnA
columnB      value_of_columnB
...          ...
Run Code Online (Sandbox Code Playgroud)

我很确定这需要动态SQL来实现,但我不知道如何开始创建查询.

任何帮助表示赞赏!

sql t-sql sql-server dynamic-sql

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

PL/SQL - where子句中的可选条件 - 没有动态sql?

我有一个查询,其中并非所有条件都是必要的.以下是使用所有条件时的示例:

select num
from (select distinct q.num
       from cqqv q
       where q.bcode = '1234567' --this is variable
             and q.lb = 'AXCT' --this is variable
             and q.type = 'privt' --this is variable
             and q.edate > sysdate - 30 --this is variable
       order by dbms_random.value()) subq
where rownum <= 10; --this is variable
Run Code Online (Sandbox Code Playgroud)

标记为--this is variable的部件是变化的部件!如果未指定条件,则没有默认值.例如,如果输入为q.type指定"*"(但保留其他所有内容相同),则查询应匹配类型的所有内容,并执行为:

select num
from (select distinct q.num
       from cqqv q
       where q.bcode = '1234567' --this is variable
             and q.lb = 'AXCT' --this is variable
             --and …
Run Code Online (Sandbox Code Playgroud)

oracle plsql dynamic-sql oracle10g

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

将表名前置到SQL结果集中的每一列?(Postgres具体)

如何获取结果集中每列的标签,以便在其表中添加名称?

我希望在单个表和连接上进行查询时发生这种情况.

例:

  SELECT first_name, last_name FROM person;
Run Code Online (Sandbox Code Playgroud)

我希望结果如下:

 | person.first_name | person.last_name |
 |-------------------|------------------|
 | Wendy             | Melvoin          |
 | Lisa              | Coleman          |
Run Code Online (Sandbox Code Playgroud)

我可以使用"AS"为每列定义别名,但这将是乏味的.我希望这会自动发生.

  SELECT first_name AS person.first_name, last_name AS person.last_name FROM person;
Run Code Online (Sandbox Code Playgroud)

我的问题的原因是我使用的数据库驱动程序不提供元数据,通知我结果集获取其数据的数据库列.我正在尝试编写通用代码来处理结果集.

我想知道如何在SQL中执行此操作,或者至少在Postgres中.

SQLite有这样一个功能,虽然我看到它现在被莫名其妙地弃用了.SQLite有两个pragma设置:full_column_namesshort_column_names.

sql postgresql dynamic-sql identifier sql-view

10
推荐指数
2
解决办法
6453
查看次数

当SP包含#temp表时,使用OPENROWSET动态检索SP结果

我的情景

我正在开发一个数据库,该数据库将包含整个服务器上不同数据库中各种存储过程的许多详细信息.我现在试图收集的信息是"SP输出什么?"

在搜索中我发现答案在于OPENROWSET.我的初步测试成功,一切看起来都很棒.但是,在使用实时SP进行测试后,我遇到了一个主要问题:它与temp(#)表不兼容.

例如:

如果我要拿这个SP:

CREATE PROCEDURE dbo.zzTempSP(@A INT, @B INT) AS
SELECT @A AS A, @B AS B
Run Code Online (Sandbox Code Playgroud)

我可以使用以下代码轻松地将输出插入到临时(##)表中,然后查询tempdb的sysobjects并生成列及其数据类型的列表:

IF OBJECT_ID('tempdb.dbo.##TempOutput','U') IS NOT NULL DROP TABLE ##TempOutput

DECLARE @sql VARCHAR(MAX)
SELECT @sql = 'SELECT * 
               INTO ##TempOutput
               FROM OPENROWSET(''SQLNCLI'', ''Server=' + 
        CONVERT(VARCHAR(100), SERVERPROPERTY('MachineName')) +
                             ';Trusted_Connection=yes;'', ''SET FMTONLY OFF exec ' + 
                               DB_NAME() + 
                              '.dbo.zzTempSP @A=1, @B=2'')'
EXEC(@sql)

SELECT *
FROM ##TempOutput
Run Code Online (Sandbox Code Playgroud)

大!但是,如果SP是这样的:

CREATE PROCEDURE dbo.zzTempSP (@A INT, @B INT) AS CREATE TABLE dbo.#T (A INT, B INT)

INSERT INTO …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server dynamic-sql openrowset

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

循环并从多个表中选择数据的函数

我是Postgres的新手,拥有一个具有相同结构的多个表的数据库.我需要从每个表中选择符合特定条件的数据.

我可以通过一堆UNION查询来做到这一点,但是我需要搜索的表的数量会随着时间的推移而改变,所以我不想像那样硬编码.我一直在尝试开发一个循环遍历特定表的函数(它们有一个共同的命名约定)并返回一个记录表,但是当我查询函数时,我没有得到任何结果.功能代码如下:

CREATE OR REPLACE FUNCTION public.internalid_formaltable_name_lookup()
  RETURNS TABLE(natural_id text, name text, natural_id_numeric text) AS
$BODY$
DECLARE
    formal_table text;
begin
  FOR formal_table IN
    select table_name from information_schema.tables
    where table_schema = 'public' and table_name like 'formaltable%'
  LOOP
    EXECUTE 'SELECT natural_id, name, natural_id_numeric
             FROM ' || formal_table || 
           ' WHERE natural_id_numeric IN (
                select natural_id_numeric from internal_idlookup
                where internal_id = ''7166571'')';
    RETURN NEXT;
 END LOOP;
 Return;
END;
$BODY$
  LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

我尝试使用该函数时没有收到任何错误,但它没有返回任何行:

SELECT * From internalid_formaltable_name_lookup();
Run Code Online (Sandbox Code Playgroud)

知道我哪里错了吗?

postgresql for-loop dynamic-sql plpgsql set-returning-functions

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

如何按月对表进行分区("两年"和"年")并自动创建每月分区?

我正在尝试按分区表.我将分区的列是具有ISO格式('20150110',20150202'等)的日期时间类型列.

例如,我有2010年,2011年,2012年的销售数据.我希望按年划分数据,每年也按月划分数据.(2010/01,2010/02,... 2010/12,2011/01,... 2015/01 ......)

EX:

Sales2010Jan,Sales2010Feb,Sales2011Jan,Sales2011Feb,Sales2012Dec等

我的问题是:它甚至可能吗?如果是,我如何使用SSIS自动化流程?

sql sql-server partitioning dynamic-sql sql-agent-job

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

为什么使用EXECUTE IMMEDIATE运行此查询会导致它失败?

我正在编写一个需要动态生成一些查询的PL/SQL过程,其中一个过程涉及使用作为参数的查询结果创建临时表.

CREATE OR REPLACE PROCEDURE sqlout(query IN VARCHAR2)
IS
BEGIN
EXECUTE IMMEDIATE  'CREATE GLOBAL TEMPORARY TABLE tmp_tab AS (' || query || ');';
END;
Run Code Online (Sandbox Code Playgroud)

它编译正确,但即使使用非常简单的查询,例如:

BEGIN
    sqlout('SELECT * FROM DUAL');
END;
Run Code Online (Sandbox Code Playgroud)

IT抛出ORA-00911: invalid character.如果我手动运行创建的查询,它会正确运行.在这一点上,我能够确定导致问题的原因.

sql oracle plsql dynamic-sql ora-00911

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

如何在SQL Server中清理动态SQL - 防止SQL注入

我们有大量依赖动态SQL的SQL Server存储过程.

存储过程的参数用于动态SQL语句中.

我们需要在这些存储过程中使用标准验证函数来验证这些参数并防止SQL注入.

假设我们有这些约束:

  1. 我们无法重写不使用动态SQL的过程

  2. 我们不能使用sp_OACreate等来使用正则表达式进行验证.

  3. 在将参数传递给存储过程之前,我们无法修改调用存储过程的应用程序来验证参数.

是否有一组字符我们可以过滤掉以确保我们不会受到SQL注入的影响?

sql-server validation stored-procedures sql-injection dynamic-sql

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

psql \copy 中的变量替换

是否可以在 PSQL 控制台导出文件中将当前日期放在文件名末尾?导出文件的名称应类似于table_20140710.csv是否可以动态执行此操作?- 日期的格式可以与上面的不同,但这并不重要。

这就是我的意思的例子:

\set curdate current_date
\copy (SELECT * FROM table) To 'C:/users/user/desktop/table_ ' || :curdate  || '.csv' WITH DELIMITER AS ';' CSV HEADER
Run Code Online (Sandbox Code Playgroud)

postgresql command-line dynamic-sql variable-substitution psql

9
推荐指数
2
解决办法
4666
查看次数

T-SQL过程,即使成功更新后标量变量也会出错

--sp_executesql version
    --SET @SQLQUERY = 'UPDATE @TableName SET Brief = @Brief,
    --               [Full] = @Full,                        
    --               CreatedBy = @CreatedBy,
    --               Department = @Department,
    --               Answer = @Answer WHERE Id=@Id';
 --SET @ParamDefinition=N'@TableName nvarchar(50),@Brief nvarchar(50),@Full nvarchar(MAX),@CreatedBy varchar(256),@Department varchar(256),@Answer nvarchar(MAX),@Id int' 
--  exec sp_executesql @SQLQUERY,@ParamDefinition,@TableName,@Brief,@Full,@CreatedBy,@Department,@Answer,@Id; 

-- exec version
SET @SQLQUERY = 'UPDATE ' + @TableName + ' SET  
                     Brief ='+ @Brief+',
                     [Full] ='+ @Full+',                        
                     CreatedBy ='+ @CreatedBy+',
                     Department ='+ @Department+',
                     Answer ='+@Answer+' WHERE Id='+CAST(@Id as nvarchar(10))

print @SQLQUERY; 
EXEC (@SQLQUERY)
Run Code Online (Sandbox Code Playgroud)

我已经使用了两个EXEC和 …

sql t-sql sql-server stored-procedures dynamic-sql

9
推荐指数
1
解决办法
53
查看次数