2015-01-22 4 views
1

SQL을 사용하지 않는 사용자가 실행할 수있는 '멍청한 증거'SQL 스크립트를 작성하려고합니다.조건이 충족 될 때만 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 등을 사용하는 방법에 대한 안내서를 보았지만 위의 방법을 설명 할 수는 없습니다.

+5

SQL 스크립트를 실행하는 서버에 SQL을 사용하지 않는 사용자에게 액세스 권한을 부여 하시겠습니까? 적어도 말하기에는 위험합니다. – WeSt

+0

원하는 SQL을 프로 시저에 넣고 실행하십시오. – Mihai

+0

@WeSt 사람들이 실제로 수동으로 테이블을 편집하는 중입니다. 내가 비 SQL-literate라고 말할 때, 그들은 몇 가지 (다양한 수준의) 능력을 가지고 있지만 스크립팅은 올바른 테이블 만 조정하는 것으로 안전한 작업을 수행 할 수있는 확실한 방법입니다. –

답변

1

이것은 MSSQL 용입니다. 나는 당신이 모든 것을 내려 받았지만 구문은 가지고 있다고 생각합니다. 나는 이것이 도움이 되었으면 좋겠다.

DECLARE @matchthis AS VARCHAR(MAX) 
DECLARE @update AS VARCHAR(1) 

SET @matchthis = 'matchme' 
[email protected] 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와 동일한 구문을 따라야하기를 원한다면 (선언 및 설정)하지 않았다.

정말 바보 같은 증거를 만들고 싶다면 사용자가 코드를 볼 수 없도록 저장 프로 시저를 만드는 것이 가장 좋습니다. 입력 상자가 있습니다.

0

여기에는 두 가지 질문이 있습니다. 이유 중 하나는 T-SQL에 중괄호가 없기 때문에 IF 문이 작동하지 않는 이유입니다. 구문은 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 
+0

원래 구문에서 IF 구문이 완전히 잘못되었음을 알고 있습니다. 그것이 내가 의사 코드라고 부르는 이유입니다. 나는 Gordon Linoff가 지금 당장 올바른 길을 걷고 있기를 바라고 있습니다. –

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'; 

이 스크립트에서 약간 다른 입니다. 실제로 @update'YES' 일 경우 select을 실행하지만 행을 반환하지 않습니다.

두 노트 :

  • SQL 서버는 문자열 상수에 대한 따옴표를 사용하지 않습니다.
  • MySQL은 저장된 프로그램을 제외하고 if 문을 허용하지 않습니다. 당신이 T-SQL에서 실행하는 스크립트가 필요한 경우
  • 라인을 주석에 대한 표준 메커니즘
  • 는 두 개의 하이픈 ( --)

, 당신은 T-SQL을 사용하여 개발해야한다.

+0

이것은 내가 달성하고자하는 것에 가장 가깝습니다. 그러나 'AND @update ...'을 where 절에 추가하면 반환 된 행이 없습니다. –

+0

@FatMonk'update'의 값은 무엇입니까? null 인 경우, null에 대한 비교가 실패했기 때문에 검사가 실패합니다. 또한 이러한 구문은 스크립트에만 적합합니다. SQL Server는 처음 사용할 때 명령/저장 프로 시저의 실행 계획을 캐시합니다. 후속 호출이 근본적으로 다른 동작을 일으키는 경우 캐시 된 실행 계획이 적합하지 않을 수 있으며 비효율적 인 쿼리가 발생합니다. –

+0

@FatMonk. . . 버머, 나는 그것을 놓쳤다. 변수도 사용할 수 없습니다. SQL Server에는 '선언'이 필요합니다. MySQL은 프로그램 블록에서'declare '만 허용한다. 그 생각을 말해줘. SQL Server에서 개발하십시오. –

관련 문제