标签: dynamic-sql

动态 SQL 逗号分隔值查询

[更新:使用 SQL Server 2005]

您好,我想要做的是使用逗号分隔的值 (ids) 列表查询我的存储过程以检索数据行。

我收到的问题是转换错误:

Conversion failed when converting the varchar value ' +
@PassedInIDs + ' to data type int.
Run Code Online (Sandbox Code Playgroud)

我的 where 子句和错误中的语句是:

...
AND (database.ID IN (' + @PassedInIDs + '))
Run Code Online (Sandbox Code Playgroud)

注意:database.ID是int类型。

我正在关注这篇文章:

http://www.sql-server-helper.com/functions/comma-delimited-to-table.aspx

但由于错误而没有完成。

在我的执行脚本中,我有:

...
@PassedInIDs= '1,5'
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么吗?感谢您的帮助。

sql dynamic-sql delimited delimiter

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

从 Oracle 中的动态 SQL 获取结果集中的结果

这个问题与我在 StackOverflow 上找到的其他几个问题类似,但这些差异对我来说足够重要,值得提出一个新问题,所以这里是:

我想从Oracle中的动态SQL获取一个结果集,然后将其作为结果集显示在类似SqlDeveloper的工具中,就像我直接执行动态SQL语句一样。这在 SQL Server 中很简单,所以具体来说,下面是 SQL Server 中的一个示例,它在 SQL Server Management Studio 或查询资源管理器中返回结果集:

EXEC sp_executesql N'select * from countries'
Run Code Online (Sandbox Code Playgroud)

或者更恰当地说:

DECLARE @stmt nvarchar(100)
SET @stmt = N'select * from countries'
EXEC sp_executesql @stmt
Run Code Online (Sandbox Code Playgroud)

问题“如何从执行动态 SQL 的 Oracle PL/SQL 匿名块返回结果集/游标?” 解决了问题的前半部分——在游标中执行动态 SQL。问题“如何使Oracle过程返回结果集”提供了类似的答案。网络搜索揭示了同一主题的许多变体,所有这些都只解决了我问题的前半部分。我发现这篇文章解释了如何在 SqlDeveloper 中执行此操作,但这使用了 SqlDeveloper 的一些功能。我实际上使用的是自定义查询工具,因此我需要将解决方案独立于 SQL 代码中。该自定义查询工具同样不具备显示 print (dbms_output.put_line) 语句输出的功能;它只显示结果集。这是使用“立即执行...批量收集”的另一种可能途径,但此示例再次使用 dbms_output.put_line 语句循环呈现结果。此链接试图解决该主题,但该问题也从未得到完全解答。

假设这是可能的,我将添加一个条件:我想在不必定义函数或过程的情况下执行此操作(由于数据库权限有限)。也就是说,我想执行一个包含动态 SQL 的独立 PL/SQL 块,并在 SqlDeveloper 或类似工具中返回结果集。


总结一下:

  • 我想执行任意 SQL 语句(因此是动态 SQL)。
  • 该平台是Oracle。
  • 解决方案必须是没有过程或函数的 PL/SQL 块。
  • 输出必须生成为规范结果集;没有打印语句。 …

oracle resultset dynamic-sql oracle-sqldeveloper

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

Postgres:查找每列的不同值的数量

我试图找到表的每一列中不同值的数量。声明性地是:

for each column of table xyz
run_query("SELECT COUNT(DISTINCT column) FROM xyz")      
Run Code Online (Sandbox Code Playgroud)

此处显示查找表的列名。

SELECT column_name 
FROM information_schema.columns
WHERE table_name=xyz
Run Code Online (Sandbox Code Playgroud)

但是,我无法在内部合并计数查询。我尝试了各种查询,这个:

SELECT column_name, thecount
FROM information_schema.columns, 
   (SELECT COUNT(DISTINCT column_name) FROM myTable) AS thecount
WHERE table_name=myTable
Run Code Online (Sandbox Code Playgroud)

语法上不允许(不允许在嵌套查询中引用 column_name)。

这似乎也是错误的(超时):

SELECT column_name, count(distinct column_name) 
FROM information_schema.columns, myTable
WHERE table_name=myTable
Run Code Online (Sandbox Code Playgroud)

使用一个查询获取表的每一列的不同值数量的正确方法是什么?

文章SQL 查找列中不同值的数量仅讨论固定列。

postgresql dynamic-sql

5
推荐指数
1
解决办法
5483
查看次数

plpgsql 中的动态变量名称(字符串到变量名称)

有没有办法动态使用变量名,我的意思是将其组成一个字符串,然后使用它。

请不要告诉我使用数组,我展示的示例只是为了更好的图片而进行的简化。

do $$ 
declare 
  var1 int:=1; 
  var2 int:=2; 
  var3 int:=3;  
  i int; 
begin
  raise notice 'Variable x %' , var1; 
  raise notice 'Variable x %' , var2; 
  raise notice 'Variable x %' , var3; 
  for i in 1..3 loop raise
     notice 'Variable x %' , 'var' || i; 
  end loop; 
end 
$$

Result

NOTICE:  Variable x 1
NOTICE:  Variable x 2
NOTICE:  Variable x 3
NOTICE:  Variable x var1
NOTICE:  Variable x var2
NOTICE:  Variable x var3
Run Code Online (Sandbox Code Playgroud)

所以我需要这样的东西,除了结果应该是数字而不是字符串,Variable …

postgresql dynamic-sql plpgsql

5
推荐指数
1
解决办法
2801
查看次数

检查触发器是否存在

我对公共模式中所有表的触发器有以下查询:

SELECT 'CREATE TRIGGER ' || tab_name|| '_if_modified_trg INSERT OR UPDATE OR DELETE ON  ' || tab_name|| ' FOR EACH ROW EXECUTE PROCEDURE audit.if_modified_func(); ' AS trigger_creation_query
FROM (
   SELECT quote_ident(table_schema) || '.' || quote_ident(table_name) as  tab_name
   FROM information_schema.tables
   WHERE table_schema='public'
   ) AS foo;
Run Code Online (Sandbox Code Playgroud)

我知道如何检查触发器是否存在:

SELECT tgname
from pg_trigger
where not tgisinternal AND tgname='randomname'
Run Code Online (Sandbox Code Playgroud)

但是,如何在第一个查询中检查同名触发器是否已存在 - 并跳过创建它并继续?这是我的解决方案,但它不起作用:

SELECT 'CREATE TRIGGER ' || tab_name|| '_if_modified_trg INSERT OR UPDATE OR DELETE ON  ' || tab_name|| ' FOR EACH ROW EXECUTE PROCEDURE audit.if_modified_func(); …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql plpgsql database-trigger

5
推荐指数
2
解决办法
7628
查看次数

动态SQL有什么危险,可以避免吗?

我们刚刚获得以下代码作为离岸开发人员提供的新应用程序中复杂搜索查询的解决方案.我对使用动态SQL持怀疑态度,因为我可以使用';关闭SQL语句.然后执行将在数据库上执行的讨厌!

关于如何解决注射攻击的任何想法?

ALTER procedure [dbo].[SearchVenues] --'','',10,1,1,''
@selectedFeature as varchar(MAX),
@searchStr as varchar(100),
@pageCount as int,
@startIndex as int,
@searchId as int,
@venueName as varchar(100),
@range int,
@latitude varchar(100),
@longitude varchar(100),
@showAll int,
@OrderBy varchar(50),
@SearchOrder varchar(10)

AS
DECLARE @sqlRowNum as varchar(max)
DECLARE @sqlRowNumWhere as varchar(max) 
DECLARE @withFunction as varchar(max)
DECLARE @withFunction1 as varchar(max)
DECLARE @endIndex as int
SET  @endIndex = @startIndex + @pageCount -1

SET @sqlRowNum = ' SELECT Row_Number() OVER (ORDER BY '

IF @OrderBy = 'Distance'
    SET @sqlRowNum …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-injection dynamic-sql

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

有没有办法从变量中选择数据库?

有没有办法从变量中选择数据库?

Declare @bob as varchar(50);
Set @bob = 'SweetDB';
GO
USE @bob
Run Code Online (Sandbox Code Playgroud)

sql sql-server dynamic-sql

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

动态生成的数据窗口中的列名称

当我使用SyntaxFromSQL动态创建数据存储区时(为了生成基于SQL SELECT语句的数据存储区源代码),使用这样的语法

string ERRORS, sql_syntax, dwsyntax_str, presentation_str
dwsyntax_str = trans_object.SyntaxFromSQL ( sql_syntax, presentation_str, ERRORS)
ds_1.Create( dwsyntax_str, ERRORS)
Run Code Online (Sandbox Code Playgroud)

如何检查生成的数据存储列的名称ds_1?我提醒你,在连接两个或多个表的select语句的情况下,结果列名可以在相关的表名之后,例如,不是获取列名,field_id我可能得到如下的列名:my_table_field_id.这会在以后提供列名称(field_id)作为GetItem函数的参数时引起问题,而相关数据存储区则命名该列my_table_field_id.

更糟糕的是,我发现我获得不同列定义(以表名称开头)的原因之一是用户的登录被分配了sa role!?!?!

powerbuilder sybase datastore dynamic-sql

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

SQL Server 2008 - 过度非规范化和索引过多:Matrix有什么用处?

我有一个崭露头角的开发人员,他非常热衷于他称之为"矩阵"的东西

我正在寻找同行的洞察力

简而言之,这就是我们所拥有的:
- 1个高度非规范化的表,大约120列
- 数据点包括帐户,客户,家庭,关系,产品,员工等...
- 每列一个索引:大约120个非聚集索引
-今天索引使用的数据库中大约90%的空间都是此表的索引
- 今天大约有150万行有很多空
- 表加载了一个存储过程,其核心是动态SQL
- 所有字段名都是通用的,不是描述数据
- 数据字典类型表与动态SQL一起使用以将任何数据点加载到任何字段
- 字段映射不是静态的:今天列dim_0001是客户名称,但明天可能是别的
- 没有主键
- 没有外键
- 没有实际约束(例如,所有字段都可以为空)

该表的参数:
- 使编写查询更简单,因为它消除了编写某些连接的需要

预期用途:
- 最终用户层,将成为Business Objects中Universe构建的核心组件
- 后ETL过程开发

我的建议要么杀死今天的进程(在测试环境中进行早期开发),要么将其移至测试的下一步.

根据我所做的研究,我的教育和经验,我不支持它,并希望一旦依赖这些表的一个或两个进程迁移到另一个解决方案,表就会被删除.

下面的脚本供您参考(我仅限于一个索引示例).

您可以提供的任何见解(甚至只是一个单词的意见)都是有价值的

-- The Matrix

CREATE TABLE [z005497].[tblMatrix](
    [as_of_dt] [datetime] NOT NULL,
    [dim_0001] [varchar](100) NULL,
    [dim_0002] [varchar](103) NULL,
    [dim_0003] [varchar](100) NULL,
    [dim_0004] [varchar](100) NULL,
    [dim_0005] [varchar](100) NULL,
    [dim_0006] [varchar](100) NULL,
    [dim_0007] [varchar](100) NULL,
    [dim_0008] [varchar](100) NULL,
    [dim_0009] [varchar](100) NULL,
    [dim_0010] [varchar](100) NULL,
    [dim_0011] …
Run Code Online (Sandbox Code Playgroud)

database-design normalization dynamic-sql sql-server-2008 non-clustered-index

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

相当于php的mysql_real_escape_string

我需要一些动态SQL来将大量值插入到数据库中.

INSERT INTO table1 (a,b,c,d) VALUES (1,2,3,'string with possible quotes'),....
Run Code Online (Sandbox Code Playgroud)

因为我想每批插入大约1,000行,所以参数实际上不是一个选项.
在php中我会使用mysql_lib并mysql_real_escape_string防止错误和SQL注入.

如何在Delphi中转义字符串值?

delphi escaping dynamic-sql

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