我有一个查询,我正在尝试将行行值转换为列名称,目前我正在使用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代码?
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语句的存储过程,该语句返回结果集?这是我的示例代码:
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) 我正在使用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功能.生产使用的情况非常理想.此外,它根本没有真正解决问题,只是隐藏它.
我该如何解决这个错误?
我正在尝试创建一个动态数据库创建脚本.
有很多步骤,我们经常创建这个数据库,所以脚本看起来像这样.
DECLARE @databaseName nvarchar(100) = 'DatabaseName'
EXEC('/*A lot of database creation code built off of @databaseName*/')
Run Code Online (Sandbox Code Playgroud)
除了我们在此数据库中创建的一个视图外,这一切都很好.
我理解的问题源于SQL中关于EXEC命令的三个规则
所以这里有三件我尝试过但没有成功的事情.
--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)
有什么建议?我认为这应该是一个常见的用例,但谷歌无法帮助我.
--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文件.他删除了文件中的任何关键词,如"EXEC", "DROP", "UPDATE", "INSERT", "TRUNC"
我想通过利用他的方式向他展示他的方式的错误 EXEC ( @sql )
我的第一次尝试将是 'EXEXECEC (N''SELECT ''You DRDROPOPped the ball Bob!'')'
但他可能会在循环中过滤掉所有内容.
有没有办法可以利用我的同事的代码?或者过滤掉关键词?
编辑:我让他检查他的代码.如果代码包含关键字,则不执行它.我还在试图弄清楚如何使用二进制转换来利用它.
我在动态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
如果我有一个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中运行脚本,将其插入表中并计算行数.
作为一些管理任务的一部分,我们有许多表,每个表都需要创建一个触发器.触发器将在修改对象时在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) dynamic-sql ×10
sql-server ×7
sql ×5
t-sql ×5
execute ×1
oracle ×1
plpgsql ×1
plsql ×1
postgresql ×1
resultset ×1
triggers ×1
validation ×1