标签: dynamic-sql

如何在动态 SQL 中处理从 OpenQuery 调用到链接分析服务器的空结果集?

我有许多与此结构类似的存储过程:

DECLARE @sql NVARCHAR(MAX)
DECLARE @mdx NVARCHAR(MAX)

CREATE table #result
(
  [col1] NVARCHAR(50),
  [col2] INT,
  [col3] INT
)

SET @mdx = '{some dynamic MDX}'
SET @sql = 'SELECT a.* FROM OpenQuery(LinkedAnalysisServer, ''' + @mdx + ''') AS a'

INSERT INTO #result
EXEC sp_executesql @sql
SELECT * FROM #result
Run Code Online (Sandbox Code Playgroud)

当多维数据集中存在结果时,这非常有效。但是,当 OpenQuery 结果为空时,INSERT 会失败并显示以下错误:

列名或提供的值数量与表定义不匹配。

我的问题是,处理这种情况的最佳方法是什么?我在静态报告文件 (.rdlc) 中使用结果,因此(我很确定)需要显式键入临时表。

t-sql ssas stored-procedures dynamic-sql openquery

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

相当于"SELECT*FROM(SELECT table_name FROM ...)"的东西?

此查询运行,但它会生成表的名称,而不是从该表中实际选择.

SELECT T.* 
  FROM (SELECT tablename 
          FROM ListOfTables 
         WHERE id = 0) AS T
Run Code Online (Sandbox Code Playgroud)

在ListOfTables包含的地方id=0, tablename='some_table',我想返回相同的结果集,就好像我直接写了一样:

SELECT * FROM some_table
Run Code Online (Sandbox Code Playgroud)

在MySQL 5中是否有以本机方式执行此操作,或者我是否必须在应用程序中执行此操作?

mysql sql mysql5 dynamic-sql

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

更新plpgsql中触发器函数中的多个列

给定以下架构:

create table account_type_a (
  id SERIAL UNIQUE PRIMARY KEY,
  some_column VARCHAR
);

create table account_type_b (
  id SERIAL UNIQUE PRIMARY KEY,
  some_other_column VARCHAR
);

create view account_type_a view AS select * from account_type_a;
create view account_type_b view AS select * from account_type_b;
Run Code Online (Sandbox Code Playgroud)

我尝试在plpgsql中创建一个通用的触发器函数,它可以更新视图:

create trigger trUpdate instead of UPDATE on account_view_type_a
for each row execute procedure updateAccount();    
create trigger trUpdate instead of UPDATE on account_view_type_a
for each row execute procedure updateAccount();
Run Code Online (Sandbox Code Playgroud)

我的不成功的努力是:

create function updateAccount() returns trigger …
Run Code Online (Sandbox Code Playgroud)

sql postgresql triggers dynamic-sql plpgsql

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

联合多个数据库的动态查询

假设我在SQL Server 2008 R2中有以下数据库

db1, db2, db3, db4, db5......dbn
Run Code Online (Sandbox Code Playgroud)

每个数据库都有一个A包含列的表C1,C2,C3

我可以Select在两个数据库上编写以下语句来获取它们之间的数据:

Select C1,C2,C3
FROM db1.dbo.A

UNION ALL

Select C1,C2,C3
FROM db2.dbo.A
Run Code Online (Sandbox Code Playgroud)

但是,如果我在同一台服务器上有50个数据库,我不想UNION ALL为每个服务器编写一个数据库.

有人可以给我一个脚本来做这个吗?我可以修改脚本以自己排除系统数据库.

谢谢

sql dynamic-sql sql-server-2008-r2

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

在插入查询中动态选择列名

获取错误列名称"@ColumnNames"无效.在最后一行(插入子句),任何想法为什么?

Declare @ColumnNames varchar(2000)
Declare @OrderId int
set @OrderId = 110077

select @ColumnNames = COALESCE(@ColumnNames + ', ', '') + COLUMN_NAME
    from 
        INFORMATION_SCHEMA.COLUMNS
    where 
        TABLE_NAME='OrderItems'

Insert into dbo.OrderHistory(@ColumnNames) select * from dbo.[Order] where ID= @OrderId
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server dynamic-sql

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

PostgreSQL 增加列长

示例我有一个名为A- 的表Z,但只有

    table "A" and table "J"
Run Code Online (Sandbox Code Playgroud)

有一个

    column clm varchar(10). 
Run Code Online (Sandbox Code Playgroud)

但后来我意识到我需要clm达到 50 码(鉴于我不知道这一点A并且J有一列clm)。

PG 中是否有可以做这件事的脚本/查询?

postgresql ddl types dynamic-sql

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

强制 PostgreSQL 在函数中使用不同的模式

我想为 PG SQL 数据库中的模式创建一个更新函数。下面是一个测试功能。它不起作用,因为它永远不应该发出通知,但在运行时会这样做test_schema_update('second')

CREATE OR REPLACE FUNCTION test_schema_update(my_schema_name VARCHAR(200)) 
RETURNS void AS
$__marker__$
DECLARE
    actualValue varchar(1000);
    testValue varchar(1000);
BEGIN
    EXECUTE 'SET search_path TO ' || quote_ident(my_schema_name);

    testValue := (SELECT max(value) FROM setting WHERE settingkey = 'libraryname');
    EXECUTE ('SELECT max(value) FROM setting WHERE settingkey = ''libraryname''')
        INTO actualValue;

    IF (actualValue != testValue)
    THEN
        RAISE NOTICE '% != %', actualValue, testValue;
        RAISE INFO 'Schema was: %', current_schema();
    END IF;

    RESET search_path;
END;
$__marker__$ LANGUAGE plpgsql;

test_schema_update('first');
test_schema_update('second');
Run Code Online (Sandbox Code Playgroud)

问题是 PG …

postgresql dynamic-sql plpgsql search-path

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

苦苦挣扎着使用Oracle动态SQL

我正在研究一个需要非常自动化的Oracle过程,所以我使用的是动态SQL.我是新手使用动态SQL.

我正在使用varchar2变量来构建需要执行的SQL.我已经使用dbms_output来捕获正在生成的SQL,并且执行正常:

sql创建Basket Swap table = CREATE TABLE INBOUND.BASKET_CTAS_SWP COMPRESS FOR QUERY HIGH as SELECT*FROM INBOUND.BASKET_FCT PARTITION(SYS_1234);

但是,当我使用它执行该过程时,它会生成以下错误

Execute MyProcedure;
Run Code Online (Sandbox Code Playgroud)

谢谢你的任何指导!

oracle版本:Oracle Database 11g企业版版本11.2.0.3.0 - 64位生产

IDE:Oracle SQL Developer版本4.0.2.15 Build 15.21

码:

note: all variables set at beginning of procedure...
Sqlexec:= 'CREATE TABLE ' || Basket_Swap_Schema ||  '.' || Basket_Swap_Table_Name  || ' ';
Sqlexec:= Sqlexec || 'COMPRESS FOR QUERY HIGH  ';
Sqlexec:= Sqlexec || 'AS SELECT * FROM ' || Basket_Source_Schema_Name || '.' || Basket_Source_Table_Name || '  ';
Sqlexec:= Sqlexec …
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql dynamic-sql oracle-sqldeveloper

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

如何将输入参数传递给sp_executesql?

在SQL Server 2014中,我试图创建一个动态WHERE子句.

我已经将查询构建为字符串,但是当我尝试使用sp_executesql执行它时,我收到以下错误: Líne13您必须声明标量变量"@desde".

我无法弄清楚如何让sp_executesql识别输入参数.

ALTER PROCEDURE [dbo].[seleccionarFacturas] 
    -- Add the parameters for the stored procedure here
    @desde char(8) = null, 
    @hasta char(8) = null,
    @minimo int = null,
    @ciudad int = null
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    DECLARE @tiendas varchar(max);

    DECLARE @tablaFacturas TABLE
    (
        fecha char(8), 
        CO char(8),
        consecutivo varchar(max),
        nombreCliente varchar(max),
        ventaTotal int
    );

    SET @tiendas='(ID_CO=20 OR ID_CO=22 OR ID_CO=23 OR …
Run Code Online (Sandbox Code Playgroud)

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

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

Postgres-SQL 状态:22004-EXECUTE 的查询字符串参数为空

我有一个表(名为 VGI_table),其中包含一个列(名为 match_tabl),其中包含同一数据库中其他表的名称以及这些表的 object_ids。我正在尝试创建一个 plpgsql 函数,该函数遍历 VGI_table 中的每一行并执行查询以从另一个表中检索对象,如下所示。

该函数有 4 个参数(都是 varchar),前两个是 VGI_table 中的列名,第三个是 VGI_table 的名称,最后一个参数是输出。

vgi_match_id_col, vgi_match_table_col, vgi_table, output_table 
Run Code Online (Sandbox Code Playgroud)

该函数的代码如下所示,ro 用于保存第一个表查询,match_row 保存查询的外部表的输出。距离是使用 PostGIS st_distance 函数创建的输出。

DECLARE
   ro record;
   match_row record;
   distance float; 

BEGIN

for ro in EXECUTE 'select gid, geom, '||vgi_match_id_col||' as match_id, '||vgi_match_table_col||' as match_table from '||vgi_table
LOOP
    --raise notice '(%)', 'select geom from public.'||ro.match_table||' where gid = '||ro.match_id;


    execute 'select geom from public.'||ro.match_table||' where gid = '||ro.match_id into match_row;


    distance := st_distance(ro.geom, st_transform(match_row.geom,st_srid(ro.geom)));
    EXECUTE 'INSERT INTO '||output_table||' …
Run Code Online (Sandbox Code Playgroud)

postgresql postgis execute dynamic-sql plpgsql

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