标签: dynamic-sql

动态SQL生成列名?

我有一个查询,我正在尝试将行行值转换为列名称,目前我正在使用SUM(Case...) As 'ColumnName'语句,如下所示:

SELECT
SKU1,
SUM(Case When Sku2=157 Then Quantity Else 0 End) As '157',
SUM(Case When Sku2=158 Then Quantity Else 0 End) As '158',
SUM(Case When Sku2=167 Then Quantity Else 0 End) As '167'
FROM
OrderDetailDeliveryReview
Group By
OrderShipToID,
DeliveryDate,
SKU1 
Run Code Online (Sandbox Code Playgroud)

以上查询效果很好,并且完全符合我的需要.但是,我正在SUM(Case...根据以下查询的结果手写出语句:

Select Distinct Sku2 From OrderDetailDeliveryReview 
Run Code Online (Sandbox Code Playgroud)

有没有办法在存储过程中使用T-SQL,我可以SUM(Case...Select Distinct Sku2 From OrderDetailDeliveryReview查询中动态生成语句,然后执行生成的SQL代码?

sql t-sql sql-server sql-server-2005 dynamic-sql

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

exec sp_executesql @sql和exec(@sql)SQL Server

lobodava的动态SQL查询是:

declare @sql nvarchar(4000) =
    N';with cteColumnts (ORDINAL_POSITION, COLUMN_NAME) as 
    (
        select ORDINAL_POSITION, COLUMN_NAME 
        from INFORMATION_SCHEMA.COLUMNS 
        where TABLE_NAME = N'''+ @tableName + ''' and COLUMN_NAME like ''' + @columnLikeFilter + '''
    ),
    cteValues (ColumnName, SumValue) as
    (
        SELECT ColumnName, SumValue
        FROM 
           (SELECT ' + @sumColumns + '
           FROM dbo.' + @tableName + ') p
        UNPIVOT
           (SumValue FOR ColumnName IN 
              (' + @columns + ')
        )AS unpvt 
    )
    select row_number() over(order by ORDINAL_POSITION) as ID, ColumnName, SumValue
    from cteColumnts c …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server dynamic-sql sql-server-2008

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

PostgreSQL - 在存储过程中编写动态sql,返回结果集

如何编写包含动态生成的SQL语句的存储过程,该语句返回结果集?这是我的示例代码:

CREATE OR REPLACE FUNCTION reporting.report_get_countries_new (
  starts_with varchar,
  ends_with varchar
)
RETURNS TABLE (
  country_id integer,
  country_name varchar
) AS
$body$
DECLARE
  starts_with ALIAS FOR $1;
  ends_with ALIAS FOR $2;
  sql VARCHAR;
BEGIN

    sql = 'SELECT * FROM lookups.countries WHERE lookups.countries.country_name >= ' || starts_with ;

    IF ends_with IS NOT NULL THEN
        sql = sql || ' AND lookups.countries.country_name <= ' || ends_with ;
    END IF;

    RETURN QUERY EXECUTE sql;

END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT …
Run Code Online (Sandbox Code Playgroud)

postgresql resultset execute dynamic-sql plpgsql

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

如何在dbms_sql.open_cursor上解决ORA-29471?

我正在使用Oracle 11.2.0.1.0并尝试让dbms_sql包工作.但是,我一直收到ORA-29471错误,如下所示:

DECLARE
  c INTEGER;
BEGIN
  c := dbms_sql.open_cursor();
END;

ORA-29471: DBMS_SQL access denied
ORA-06512: at "SYS.DBMS_SQL", line 1017
ORA-06512: at line 4
Run Code Online (Sandbox Code Playgroud)

oracle 文档说下面这个:

绑定和执行时进行检查.可选地,可以对每个单独的DBMS_SQL子程序调用执行检查.检查是:

  • 调用子程序时current_user与调用最新解析时的相同.
  • 调用子程序时启用的角色必须是调用最新解析时已启用角色的超集.

与使用定义者权利子程序一致,角色不适用.如果检查失败,则引发ORA-29470错误.

据我所知,这两个条件都不适用于我的代码,因为代码不会跨越模式.

Oracle 支持(需要登录)网站建议我将security_level参数显式添加到dbms_sql.open_cursor中.添加任何值(0/1/2)都无法解决问题.

对我来说令人费解的是,我得到了错误dbms_sql.open_cursor,这是首次定义安全级别的地方.

支持网站还提出了一个涉及设置的解决方法:

alter system set "_dbms_sql_security_level" = 384 scope=spfile;
Run Code Online (Sandbox Code Playgroud)

我还没有尝试过.我更愿意将其视为最后的手段,因为它涉及禁用安全层,而且它是一个不受支持的oracle功能.生产使用的情况非常理想.此外,它根本没有真正解决问题,只是隐藏它.

我该如何解决这个错误?

oracle plsql dynamic-sql

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

使用动态Sql创建视图

我正在尝试创建一个动态数据库创建脚本.

有很多步骤,我们经常创建这个数据库,所以脚本看起来像这样.

 DECLARE @databaseName nvarchar(100) = 'DatabaseName'
 EXEC('/*A lot of database creation code built off of @databaseName*/')
Run Code Online (Sandbox Code Playgroud)

除了我们在此数据库中创建的一个视图外,这一切都很好.

我理解的问题源于SQL中关于EXEC命令的三个规则

  1. 使用环境只对EXEC的生命有效
  2. 'CREATE VIEW'必须是查询批处理中的第一个语句
  3. GO实际上不是SQL命令,因此在动态sql中不允许这样做
  4. 在CREATE VIEW上,您只能指定为Schema.

所以这里有三件我尝试过但没有成功的事情.

--Result: Error message, "'CREATE VIEW' must be the first statement in a query batch"
EXEC 
('
    USE [' + @databaseName + ']
    CREATE VIEW
')
Run Code Online (Sandbox Code Playgroud)

有什么建议?我认为这应该是一个常见的用例,但谷歌无法帮助我.

t-sql sql-server dynamic-sql

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

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
查看次数

我如何利用"EXEC @sql"?

我的同事对他的代码不安全,并允许用户上传要在服务器上运行的SQL文件.他删除了文件中的任何关键词,如"EXEC", "DROP", "UPDATE", "INSERT", "TRUNC"

我想通过利用他的方式向他展示他的方式的错误 EXEC ( @sql )

我的第一次尝试将是 'EXEXECEC (N''SELECT ''You DRDROPOPped the ball Bob!'')'

但他可能会在循环中过滤掉所有内容.

有没有办法可以利用我的同事的代码?或者过滤掉关键词?

编辑:我让他检查他的代码.如果代码包含关键字,则不执行它.我还在试图弄清楚如何使用二进制转换来利用它.

t-sql sql-server validation sql-injection dynamic-sql

8
推荐指数
1
解决办法
331
查看次数

将nvarchar转换为int的动态SQL错误

我在动态SQL中创建了一个具有select语句的过程,代码如下所示:

ALTER PROCEDURE cagroup    (
    @DataID INT ,
    @days INT ,
    @GName VARCHAR(50) ,
    @T_ID INT ,
    @Act BIT ,
    @Key VARBINARY(16)
)
AS
BEGIN
    DECLARE @SQL NVARCHAR(MAX)
    DECLARE @SchemaName SYSNAME
    DECLARE @TableName SYSNAME
    DECLARE @DatabaseName SYSNAME
    DECLARE @BR CHAR(2)
    SET @BR = CHAR(13) + CHAR(10)

    SELECT  @SchemaName = Source_Schema ,
            @TableName = Source_Table ,
            @DatabaseName = Source_Database
    FROM    Source
    WHERE   ID = @DataID

SET @SQL =  'SELECT ' + @GName + ' AS GrName ,' + @BR
                + @T_ID …
Run Code Online (Sandbox Code Playgroud)

sql sql-server stored-procedures dynamic-sql sql-server-2008

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

如何判断存储在变量中的SQL是否会返回任何行

如果我有一个SQL脚本存储在这样的变量中:

DECLARE @SQL VARCHAR(MAX) = 'SELECT * FROM Employees WHERE Age > 80'
Run Code Online (Sandbox Code Playgroud)

如果我要运行它,我如何判断@SQL是否会返回任何行?

实际上这个:

IF EXISTS(@SQL) print 'yes, there are rows' -- Dummy code -- does not work!
Run Code Online (Sandbox Code Playgroud)

我想尝试这个,而不必在@SQL中运行脚本,将其插入表中并计算行数.

sql sql-server dynamic-sql

8
推荐指数
1
解决办法
1957
查看次数

动态sql错误:'CREATE TRIGGER'必须是查询批处理中的第一个语句

作为一些管理任务的一部分,我们有许多表,每个表都需要创建一个触发器.触发器将在修改对象时在Audit数据库中设置标志和日期.为简单起见,我有一个表,其中包含所有需要触发器创建的对象.

我试图生成一些动态的SQL来为每个对象执行此操作,但我收到此错误:
'CREATE TRIGGER' must be the first statement in a query batch.

这是生成sql的代码.

CREATE PROCEDURE [spCreateTableTriggers]
AS

BEGIN

DECLARE @dbname     varchar(50),
        @schemaname varchar(50),
        @objname    varchar(150),
        @objtype    varchar(150),
        @sql        nvarchar(max),
        @CRLF       varchar(2)

SET     @CRLF = CHAR(13) + CHAR(10);

DECLARE ObjectCursor CURSOR FOR
SELECT  DatabaseName,SchemaName,ObjectName
FROM    Audit.dbo.ObjectUpdates;

SET NOCOUNT ON;

OPEN    ObjectCursor ;

FETCH NEXT FROM ObjectCursor
INTO    @dbname,@schemaname,@objname;

WHILE @@FETCH_STATUS=0
BEGIN

    SET @sql = N'USE '+QUOTENAME(@dbname)+'; '
    SET @sql = @sql + N'IF EXISTS (SELECT * FROM sys.triggers WHERE object_id …
Run Code Online (Sandbox Code Playgroud)

triggers dynamic-sql sql-server-2008

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