2012-11-13 4 views
1

SQL 테이블에 text_en, text_es, text_de와 같은 일부 열이 있습니다. 이제 언어에 따라 단 하나의 열에서 값을 가져 오려고합니다. 그래서 나는 SQL 문자열 SELECT @textfield FROM <table> 를 생성하고 VB 코드에서 나는 cmd.AddWithValue("textfield", "text_" + lang) 를 사용하지만 SQL은 열 이름 대신 해당 컬럼의 값을 반환합니다. 어떻게 가치를 얻을 수 있습니까?매개 변수로 열 이름

+0

내가 당신, 테이블 디자인을 변경할 수있는 능력을 가지고 생각하지 않습니다 할 수 있습니까? 이론적으로 언어는 언어에 대해 별도의 열을 사용하는 대신 값으로 정규화됩니다. 이렇게하면 나중에 테이블 스키마를 업데이트하지 않고 언어를 추가 할 수 있으며 'select * from

where language = @ language'와 같은 더 나은 쿼리도 가능합니다. –

답변

2

또한

SELECT CASE @textfield 
     WHEN 'text_en' THEN text_en 
     WHEN 'text_es' THEN text_es 
     WHEN 'text_de' THEN text_de 
     END AS local_text 
FROM TableName 
+0

+1 - 아니 동적 SQL 참여 – Lamak

+0

이 방법은 트릭을하고 있습니다. 특히 case-when-else 구조가 예측되지 않은 lang 문자열의 사실을 다루기 때문에 – Makis

1

매개 변수로 전달하지 말고 문자열 리터럴로 전달하십시오. SQL 문은 형식이어야합니다 :

string col1name = 'somename'; 
string sql = 'SELECT ' + col1name + ' FROM TableName'; 

을하지만 당신은 WHERE 절에 전달 된 매개 변수가 있다면 당신은 당신이 당신의 질문에 무슨 짓을했는지 등의 매개 변수로 전달해야한다.

참고 : 쿼리는이 방법이 SQL Injection에 취약합니다. 귀하의 경우 연결된 SQL 문을 저장 프로 시저에 전달한 다음 EXEC()이 아닌 sp_executesql을 사용할 수 있습니다.

+1

SQL 주입, 누구? – Oded

+0

감사합니다. 마흐무드, 내 하루를 구한다! – Makis

+0

@Makis - Be ** 매우 **주의 깊게 이것을 수행하십시오. [SQL Injection] (http://en.wikipedia.org/wiki/SQL_injection) – Oded

1

변수는 SQL에서 열 이름으로 사용할 수 없습니다. 어쨌든이 것은 아닙니다.

이와 같이 열 이름을 지정하려면 동적 SQL을 사용해야합니다.

주제의 포괄적 인 치료를 위해 The Curse and Blessings of Dynamic SQL을 읽는 것이 좋습니다.

+0

링크에 thnx : – Sohail

관련 문제