我正在尝试编写存储过程,并且根据某个列值,我希望能够更改我选择的表.我试着举个例子:
SELECT ItemNumber,
ItemType,
Description
FROM
CASE ItemType
WHEN 'A' THEN TableA
ELSE TableB
END
WHERE
CASE ItemType
WHEN 'A' THEN ItemNumber = @itemNumber
ELSE PartNumber = @itemNumber
END
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我不仅动态地更改了我选择的表,而且由于这两个表是由两个不同的人在两个不同的时间创建的,因此列名也不同.
所以,我的问题是:实现这一目标的最佳方法是什么,因为SQL Server似乎不喜欢我构建的查询.
如果有人看到我想要做的事情可以建议一个更好的方法来做到这一点,我会全力以赴:-)
我不明白为什么以下是给我错误的.我认为它与注释掉的部分有关,但@SQL是nvarchar(4000).
BEGIN
sp_executesql N'SELECT ''td'''
--sp_executesql @SQL, N'@StartDate DateTime, @EndDate DateTime, @End2 DateTime, @Program varchar(4)', @StartDate, @EndDate, @End2, @Program
END
Run Code Online (Sandbox Code Playgroud) 这是一个棘手的问题 - 我如何以编程方式创建和查询其内容我无法预见的数据库?
我正在实现一个通用的输入表单系统.用户可以使用WYSIWYG布局创建PHP表单,并将其用于他希望的任何目的.他也可以查询输入.
所以,我们有三个阶段:
由于这些表单是通用的,我无法预测数据库结构 - 除了说它将反映HTML表单字段并且包括来自编辑框,备忘录,单选按钮等的集合的数据输入.
问题和评论:
A)如何在表和列方面最好地构建数据库?主键怎么样?我的第一个想法是使用控件名称来标识每一列,然后我意识到用户可以编辑表单并重命名,这样可能"名称"变为"员工"或"工资"变为":薪水".我倾向于每个人的唯一编号.
B)如何最好地键入行?我在想一个允许我查询的时间戳和来自A的行Id的列
C)我必须处理列重命名/插入/删除.敌人删除,我不确定是否从数据库中删除数据.即使用户不再从表单输入它,他也可能希望查询先前输入的内容.或者可能存在一些保留数据的法律要求.列重命名/插入/删除中的任何问题?
D)对于查询,我可以让我的PHP查询数据库以获取列名并生成一个带有列表的表单,其中每个条目都有一个数据库列名,一个复选框说明它是否应该在查询中使用,并且基于列类型,一些选择标准.这应该足以构建像"position ='高级推销员'和薪水> 50k"这样的搜索.
E)我可能必须生成一些花哨的图表 - 图表,直方图,饼图等,以便随着时间的推移查询数值数据的结果.我需要为此找到一些好的FOSS PHP.
F)我还忘记了什么?
对我来说这一切看起来都很棘手,但我是数据库n00b - 也许你对大师来说很简单?
编辑:请不要告诉我不要这样做.我没有任何选择:-(
编辑:在现实生活中,我不希望列重命名/插入/删除频繁.但是,运行几个月后可能需要更改数据库.我确信这种情况经常发生.我担心我已经严重地提出了这个问题并且人们认为每10分钟左右就会发生变化.
实际上,我的用户将在布置表单时定义数据库.他们可能第一次就做对了,永远不会改变它 - 特别是如果他们从纸质表格转换.即使他们决定改变,这可能只发生一次或两次,数月或数年后 - 这可能发生在任何数据库中.
我不认为我在这里有一个特例,也不认为我们应该专注于改变.或许更好地专注于联系 - 什么是一个好的主键计划?或许,对于一个文本输入,一个数字和一个备忘录?
需要有关此SQL Server 2000过程的帮助.问题变得困难,因为我正在通过Oracle SQL Developer测试程序.
我正在运行使用Varchar格式的新数字序列迭代列的过程,以便为那些具有空值的人.
但我一直收到错误,所以a)我可能做错了方法b)由于使用的版本语法不正确.我主要是Oracle用户.
我一直得到的错误:SQL Error: Incorrect syntax near the keyword 'End'.这没有足够的帮助解决它.本End是指在程序的最后"终结".
任何帮助将不胜感激.
这是程序.
ALTER PROCEDURE [dbo].[OF_AUTOSEQUENCE] @JvarTable Varchar(250), @varColumn Varchar(250), @optIsString char(1), @optInterval int AS
/*
Procedure OF_AUTOSEQUENCE
Created by Joshua [Surname omitted]
When 20100902
Purpose To fill up column with new sequence numbers
Arguments varTable - Table name
varColumn - Column name
optIsString - Option: is it string or numeric, either use T(rue) or F(alse)
optInterval - Steps in increment in …Run Code Online (Sandbox Code Playgroud) sql-server stored-procedures sql-server-2000 dynamic-sql syntax-error
我的同事对他的代码不安全,并允许用户上传要在服务器上运行的SQL文件.他删除了文件中的任何关键词,如"EXEC", "DROP", "UPDATE", "INSERT", "TRUNC"
我想通过利用他的方式向他展示他的方式的错误 EXEC ( @sql )
我的第一次尝试将是 'EXEXECEC (N''SELECT ''You DRDROPOPped the ball Bob!'')'
但他可能会在循环中过滤掉所有内容.
有没有办法可以利用我的同事的代码?或者过滤掉关键词?
编辑:我让他检查他的代码.如果代码包含关键字,则不执行它.我还在试图弄清楚如何使用二进制转换来利用它.
我有一个数据库,所有访问都由存储过程控制.DBA希望避免为用户提供对基础表的直接读/写访问权限,这是我能理解的.因此,所有数据的更新和选择都是通过存储过程完成的.基本上,他创建了一个角色,该角色对数据库中的所有存储过程具有EXECUTE权限,并为用户提供该角色.
问题是其中一个存储过程动态构建一个SQl查询并通过"Execute sp_Executesql"执行它.在不详细说明的情况下,查询是动态构建的,因为它会根据许多用户输入参数而显着变化.有问题的存储过程只是一个SELECT sql语句,但我发现只是给存储过程EXECUTE权限是不够的.存储过程中引用的使用"执行sp_Executesql"的基础表需要被赋予"datareader"访问权限,否则存储过程将失败.
有关如何纠正此问题的任何想法?我真的想将对表的访问限制为仅存储过程,但我需要找到一种方法来解决使用"Execute sp_Executesq"l的存储过程.谢谢.
作为一些管理任务的一部分,我们有许多表,每个表都需要创建一个触发器.触发器将在修改对象时在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) 这可能是一个简单的答案,但我已经盯着它看了太久......
我有以下查询,它将存储过程输入参数作为变量名称并计算该表中的记录.我想将动态语句(@toStartStr)的结果检索到变量(@toStart)中.
-- @tempTableName = SProc input parameter
DECLARE @toStartStr nvarchar(150);
DECLARE @toStart int;
SET @toStartStr = 'SELECT @toStart = COUNT(ID) FROM ' + @tempTableName;
EXEC(@toStartStr);
Run Code Online (Sandbox Code Playgroud)
眼下,一个错误提示@toStart不能与串选择连在一起,但是这是我想要的要点.谁能看到我做错了什么?或建议另类?仅供参考我的SQL 2008 R2.谢谢.
我正在尝试编写一个函数来将csv数据加载到表中.我希望输入参数是文件的路径.
CREATE OR REPLACE FUNCTION public.loaddata(filepathname varchar)
RETURNS void AS
$BODY$
BEGIN
COPY climatedata(
climatestationid,
date,
prcp,
prcpqflag,
prcpmflag,
prcpsflag,
tmax,
tmaxqflag,
tmaxmflag,
tmaxsflag,
tmin,
tminqflag,
tminmflag,
tminsflag)
FROM $1
WITH csv header;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION public.filltmaxa(character varying)
OWNER TO postgres;
Run Code Online (Sandbox Code Playgroud)
当我尝试创建此功能时,我得到了
$ 1的语法错误
它出什么问题了?
鉴于下表:
USE tempdb;
CREATE TABLE #T(Val INT);
INSERT INTO #T VALUES (1), (2), (3), (4), (5);
Run Code Online (Sandbox Code Playgroud)
我想使用EXEC给定的Val值执行动态sql查询:
DECLARE @sql NVARCHAR(MAX);
DECLARE @Val INT = 3;
EXEC ('SELECT * FROM #T WHERE Val = ' + @Val);
Run Code Online (Sandbox Code Playgroud)
执行时没有错误,并给出正确的结果.
我的假设是这会产生错误:
将varchar值'SELECT*FROM #T WHERE Val ='转换为数据类型int时转换失败.
由于@Val是INT数据类型和数据类型优先级的规则,因此EXEC必须将其中的查询转换为INT.
我的问题是为什么没有EXEC产生转换错误的调用?
笔记:
- 我知道sp_executesql.我也不是在寻求替代方案.我只是要求解释为什么没有产生错误.
-这个问题的答案的问题似乎并没有解释我的情况的问题,是指VARCHAR以VARCHAR串联.
dynamic-sql ×10
sql ×6
sql-server ×6
t-sql ×3
database ×1
permissions ×1
php ×1
plpgsql ×1
postgresql ×1
syntax-error ×1
triggers ×1
validation ×1