我正在寻找一种在多个表上执行动态搜索的模式.
我无法控制遗留(以及设计不佳)的数据库表结构.
考虑类似于简历搜索的场景,其中用户可能想要对简历中的任何数据执行搜索并返回与其搜索条件匹配的简历列表.可以随时搜索任何字段并与一个或多个其他字段组合搜索.
实际的sql查询是根据搜索的字段动态创建的.我发现的大多数解决方案都涉及复杂的块,但我不禁认为必须有一个更优雅的解决方案,因为现在这必须是一个已解决的问题.
是的,所以我开始在代码中动态构建sql的道路.似乎很神奇.如果我真的试图支持所请求的查询任何表中任何字段的任何组合的能力,那么这将是一组大量的if语句. 发抖
我相信我读过COALESCE仅在您的数据不包含NULL时才有效.那是对的吗?如果是这样,不要去,因为我到处都有NULL值.
sql database-design design-patterns table-structure dynamic-sql
考虑以下TSQL:
SET @WhereClause1 = 'where a.Date > ' + @InvoiceDate
Run Code Online (Sandbox Code Playgroud)
我收到日期/字符串转换错误. @InvoiceDate是一个日期时间变量.什么是正确的语法?
尝试以下代码.但是获取'xml数据类型方法的参数1"修改"必须是字符串文字'错误.搜索了很多,但无法找到解决此问题的任何方法
SET @Path = '/@ParentNodeName/@NodeName/child::*'
SET @x.modify('insert attribute status {sql:variable("@status")}
as first into (' + @Path + ')[1]')
Run Code Online (Sandbox Code Playgroud) 我需要知道PostgreSQL中的列类型(即varchar(20)).我知道我可能会\d在psql中使用某些内容找到它,但我需要使用select查询来完成它.
这在PostgreSQL中是否可行?
我有一个存储过程,它使用该EXECUTE IMMEDIATE命令执行一个非常长的字符串.如何支持非常长的字符串并将数据返回到refcursor中?
在Oracle中,编写动态SQL时,会执行以下操作:
create or replace procedure myProc(n in number)
as
begin
execute immediate
'update myTable set myColumn = :n'
using n;
commit;
end;
Run Code Online (Sandbox Code Playgroud)
然后'魔术发生'.SQL Server中等效的概念/语法是什么(如果有的话)?(顺便说一句,我正在使用SQL Server 2005)
我有一个接受多个参数的存储过程(即pName,pHeight,pTeam)
我有这样的查询:
SQLQuery VARCHAR2(6000);
TestCursor T_CURSOR;
SQLQuery := 'SELECT ID, Name, Height, Team FROM MyTable WHERE ID IS NOT NULL ';
-- Build the query based on the parameters passed.
IF pName IS NOT NULL
SQLQuery := SQLQuery || 'AND Name LIKE :pName ';
END IF;
IF pHeight IS > 0
SQLQuery := SQLQuery || 'AND Height = :pHeight ';
END IF;
IF pTeam IS NOT NULL
SQLQuery := SQLQuery || 'AND Team LIKE :pTeam ';
END IF;
OPEN TestCursor …Run Code Online (Sandbox Code Playgroud) 请耐心等待,因为这是我的第一篇文章.
我正在尝试在PostgreSQL-9.2中运行COPY命令,将.txt文件中的制表符分隔表添加到PostgreSQL数据库,例如:
COPY raw_data FROM '/home/Projects/TestData/raw_data.txt' WITH (DELIMITER ' ');
Run Code Online (Sandbox Code Playgroud)
我已经使用SQL命令在数据库中创建了一个名为"raw_data"的空表:
CREATE TABLE raw_data ();
Run Code Online (Sandbox Code Playgroud)
尝试运行该COPY命令时,我不断收到以下错误消息:
ERROR: extra data after last expected column
CONTEXT: COPY raw_data, line 1: " 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 ..."
Run Code Online (Sandbox Code Playgroud)
(这里的数字应该是列标题)
我不确定它是否因为我在创建db表时没有指定表列但是我试图避免手动输入800或列.
对于如何解决这个问题,有任何的建议吗?
以下是.txt文件的示例:
1 2 3 4 5 6 …Run Code Online (Sandbox Code Playgroud) 我试图更新一个工作正常的存储过程,而无需使用sp_executesql.我现在想要将表名作为参数,因为我有许多具有相同结构的表,并且不希望为每个表创建新的存储过程.
我遇到的问题是这个版本似乎需要所有参数,而前一个版本接受任意数量的参数.例如,如果我删除所有WHERE参数并且只有@TableName参数,它可以正常工作.我试过寻找一个例子,但我找不到这样的东西.解析表名的所有示例都只包含该参数.
CREATE PROCEDURE cafgTenantNamesTEST2
@TableName sysname,
@Square nvarchar(100) = null,
@Location nvarchar(100) = null,
@Name nvarchar(100) = null,
@NormalizedName nvarchar(100) = null,
@SharedLand int = 0,
@FieldNumber int = 0,
@Description nvarchar(255) = null,
@Dwelling nvarchar(100) = null
AS
BEGIN
DECLARE @sql AS NVARCHAR(MAX)
SET @sql = 'SELECT * FROM [' + @TableName + ']' +
'WHERE ([Square] LIKE ''' + @Square + ''' OR ''' + @Square + ''' IS NULL)' +
'AND ([Location] = ''' + @Location …Run Code Online (Sandbox Code Playgroud) 我有一个具有几个表(几百个)的postgres数据库。一个子集 富在数据库中的表具有相同的架构。
理想情况下,我想创建一个存储过程,该存储过程可以针对单个表或子集Foo中的所有表运行查询。
伪代码:
CREATE TABLE tbl_a (id INTEGER, name VARCHAR(32), weight double, age INTEGER);
CREATE TABLE tbl_b (id INTEGER, name VARCHAR(32), weight double, age INTEGER);
CREATE TABLE tbl_c (id INTEGER, name VARCHAR(32), weight double, age INTEGER);
CREATE TABLE tbl_d (id INTEGER, name VARCHAR(32), weight double, age INTEGER);
CREATE TYPE person_info AS (id INTEGER, name VARCHAR(32), weight double, age INTEGER);
CREATE FUNCTION generic_func(ARRAY one_or_more_table_names)
RETURNS person_info
-- Run query on table or all specified tables
AS …Run Code Online (Sandbox Code Playgroud) dynamic-sql ×10
postgresql ×3
sql ×3
t-sql ×3
oracle ×2
sql-server ×2
date ×1
datetime ×1
parameters ×1
sqlbulkcopy ×1
types ×1
xml ×1