我正在尝试编写一个可以由非SQL文字用户运行的“idiot proof”SQL脚本。
我的想法是在脚本顶部定义几个变量,然后根据这些变量运行特定的查询。
我正在测试mySQL,但最终会在SQL-Server上运行。
在伪代码中,我正在尝试这样做:
# Set matchThis to the value to match
SET @matchThis = "matchMe";
# Uncomment (remove the #) one of the two lines below to update or just view
#SET @update = "YES";
SET @update = "NO";
IF @update = "YES" {
UPDATE myTable SET myColumn = "changed" WHERE matchVal = @matchThis;
} ELSE {
SELECT * FROM myTable WHERE matchVal = @matchThis;
}
如果有办法,我想在SQL中完全执行此操作。
我见过有关使用SELECT IF
等的指南,但无法弄清楚如何实现上述目标。
答案 0 :(得分:1)
这适用于MSSQL。我认为你的一切都失败但语法。我希望这有助于/有效。
DECLARE @matchthis AS VARCHAR(MAX)
DECLARE @update AS VARCHAR(1)
SET @matchthis = 'matchme'
--@update can be Y or N. User changes this here.
SET @update = 'Y'
IF @update = 'Y'
UPDATE mytable SET myColumn = 'changed' WHERE matchval = @matchthis
ELSE IF @update = 'N'
SELECT * FROM myTable WHERE matchval = @matchthis
我不知道是否要更改变量,但如果要将其变为变量,请遵循@matchthis(声明和设置)的相同语法。
如果你想让这个非常白痴,我说最好的办法就是制作一个存储过程,以便用户看不到代码,他们只有输入框。
答案 1 :(得分:0)
这里有两个问题。一个是IF
语句不起作用的原因 - 因为T-SQL没有大括号。语法显示在the documentation。
但重要的问题是如何在不让用户修改脚本本身的情况下将参数传递给脚本。这是使用Script Variables完成的。使用sqlcmd
命令执行脚本时,$(SomeName)
形式的任何文本都将替换为命令行参数或具有相同名称的环境变量。
例如,如果您有以下脚本
USE AdventureWorks2012;
SELECT x.$(ColumnName)
FROM Person.Person x
WHERE c.BusinessEntityID < 5;
此命令将以FirstName
作为列名
sqlcmd -v ColumnName ="FirstName" -i c:\testscript.sql
答案 2 :(得分:0)
如果你想获得一个在MySQL和SQL Server中运行相同的脚本,你会非常乐观。但是,对于基本脚本,您可以这样做:
-- Set matchThis to the value to match
SET @matchThis = 'matchMe';
-- Uncomment (remove the #) one of the two lines below to update or just view
-- SET @update = 'YES';
SET @update = 'NO';
UPDATE myTable
SET myColumn = 'changed'
WHERE matchVal = @matchThis AND @update = 'YES';
SELECT *
FROM myTable
WHERE matchVal = @matchThis AND @update <> 'YES';
这与您的脚本不同略有。如果select
为@update
,则实际运行'YES'
,但不会返回任何行。
两个注释:
if
语句,但存储程序除外。--
)如果您需要在T-SQL中运行脚本,则应使用T-SQL开发它。