Вернуться   Форум программистов > Форум Базы данных > Форум SQL Server

SQL Server

Программирование MS SQL Server

Ответ
 
Старый 13.11.2006, 16:05   #11
evgenybe
Местный
 
Регистрация: 04.03.2002
Сообщений: 663
evgenybe пока не определено
По умолчанию RE: Проблема в названии поля

Дополнительный вопрос.
Мне нужно составить SQL Statement в StoredProcedure. Наподобие выше описанного, у меня заранее не известны ИмяТаблицы, ИменаПолей и Выражение WHERE. дополнительная проблема в том, что в WHERE задается поле типа Varchar равное параметру, значение которого может в некоторых случаях содержать одинарную или двойную кавычку.
Как я могу учесть это, чтобы не получить ошибку?
evgenybe вне форума  
Старый 13.11.2006, 16:20   #12
Alexey Spirin
Местный
 
Регистрация: 11.08.2001
Сообщений: 1,753
Alexey Spirin пока не определено
По умолчанию RE: Проблема в названии поля

Не понял, четсно говоря, в чем именно проблема.
Однако, по всей видимости вопрос в том, как вставляются одинаковые кавычки в строки. Их просто достаточно удвоить. Т.е. следующий пример будет работать:
Т.е. </P><FONT color=#0000ff size=2>
DECLARE<FONT color=#000000 size=2> @Where <FONT color=#0000ff size=2>varchar<FONT color=#808080 size=2>(<FONT color=#000000 size=2>50<FONT color=#808080 size=2>),<FONT color=#000000 size=2> @SQL <FONT color=#0000ff size=2>varchar<FONT color=#808080 size=2>(<FONT color=#000000 size=2>255<FONT color=#808080 size=2>)</P><FONT color=#0000ff size=2>
SET<FONT color=#000000 size=2> @Where<FONT color=#808080 size=2>=<FONT color=#ff0000 size=2>'Name like ''A%'''</P><FONT color=#0000ff size=2>
SET<FONT color=#000000 size=2> @SQL <FONT color=#808080 size=2>=<FONT color=#000000 size=2> <FONT color=#ff0000 size=2>'SELECT * FROM Users '<FONT color=#000000 size=2> <FONT color=#808080 size=2>+<FONT size=2><FONT color=#000000> @Where</P><FONT color=#0000ff size=2>
PRINT<FONT size=2><FONT color=#000000> @SQL
<FONT size=2><FONT color=#000000>Получим <FONT size=1>SELECT * FROM Users Name like 'A%'
<FONT size=2><FONT color=#000000><FONT size=1>---
<FONT size=2><FONT color=#000000><FONT size=1>PS: Не забывайте про SQL Injection атаки.</P>
Alexey Spirin вне форума  
Старый 13.11.2006, 16:25   #13
bazile
Местный
 
Регистрация: 05.01.2001
Сообщений: 6,924
bazile пока не определено
По умолчанию RE: Проблема в названии поля

Передавать эту строку в качестве параметра для http://msdn2.microsoft.com/en-us/library/ms188001.aspx sp_executesql или вручную удваивать одинарные кавычки внутри строки. Способ с использованием параметров является предпочтительным.
bazile вне форума  
Старый 13.11.2006, 16:44   #14
evgenybe
Местный
 
Регистрация: 04.03.2002
Сообщений: 663
evgenybe пока не определено
По умолчанию RE: Проблема в названии поля

Предположим, что некий параметр @WhereValue = " My N' = 12345 ". То есть одиночная (или двойная) кавычка может находиться в неизвестном месте стринга. Может вначале, может в середине, может в конце... А может и вообще отсутствовать. Изначально это неизвестно.
Теперь я составляю strSQL = 'SELECT ' + @Field1 + ',' + @Field2 + ' FROM ' + @TableName ' + WHERE ' + @Field1 = '' + @ WhereValue + ''
И затем исполняю его.
Вопрос:
Как правильно составить в таком случае strSQL?
evgenybe вне форума  
Старый 13.11.2006, 17:09   #15
bazile
Местный
 
Регистрация: 05.01.2001
Сообщений: 6,924
bazile пока не определено
По умолчанию RE: Проблема в названии поля

SET @strSQL = 'SELECT ' + @Field1 + ',' + @Field2 + ' FROM ' + @TableName ' + WHERE ' + @Field1 = @Field1Condition'
exec sp_executesql @strSQL, N'@Field1Condition varchar(100)', @Field1Condition=@WhereValue
bazile вне форума  
Старый 13.11.2006, 19:07   #16
evgenybe
Местный
 
Регистрация: 04.03.2002
Сообщений: 663
evgenybe пока не определено
По умолчанию RE: Проблема в названии поля

Вот моя процедура:</P>
ALTER PROCEDURE <FONT color=#000000>dbo.spGetValue
(
@TableName nVarchar(50),
@FieldValue nVarchar(50),
@FieldText nVarchar(50),
@WhereValue nVarChar(50)
)</P>
AS</P>
declare @sSQL nvarchar;
SET @sSQL = 'SELECT ' + @FieldValue +
' FROM ' + @TableName
+ ' WHERE ' + @FieldText + ' = ' + @WhereValue +
' ORDER BY ' + @FieldText
exec sp_executesql @sSQL, N'@WhereValue nvarchar(100)', @WhereValue=@WhereValue
RETURN
Однако я получаю следующее исключение:</P><FONT size=1>
Line 1: Incorrect syntax near 'S'.
No rows affected.
(0 row(s) returned)
@RETURN_VALUE = 0
Finished running dbo."spGetValue".</P>
evgenybe вне форума  
Старый 13.11.2006, 19:22   #17
bazile
Местный
 
Регистрация: 05.01.2001
Сообщений: 6,924
bazile пока не определено
По умолчанию RE: Проблема в названии поля

А длину у nvarchar для переменной @sSQL кто объявлять будет? По умолчанию будет тип nvarchar(1) и в итоге запрос сокращается до одной буквы S. Откуда и ошибка про Incorrect syntax near 'S'
bazile вне форума  
Старый 13.11.2006, 19:34   #18
Alexey Spirin
Местный
 
Регистрация: 11.08.2001
Сообщений: 1,753
Alexey Spirin пока не определено
По умолчанию RE: Проблема в названии поля

Чтобы таких проблем не возникало - делай PRINT перед EXEC'ом - сразу все стало бы ясно.
Alexey Spirin вне форума  
Старый 13.11.2006, 19:52   #19
evgenybe
Местный
 
Регистрация: 04.03.2002
Сообщений: 663
evgenybe пока не определено
По умолчанию RE: Проблема в названии поля

bazile, ты абсолютно прав. Я исправил, и кое что переделал. Теперь ошибок не дает, но и не возвращает ничего. Вот новый код:</P>
ALTER PROCEDURE <FONT color=#000000>dbo.spGetValue
(
@TableName nVarchar(50),
@FieldValue nVarchar(50),
@FieldText nVarchar(50),
@WhereValue nVarChar(50)
)</P>
AS</P>
declare @sSQL nvarchar(400);
Declare @Turn nvarchar(50);
SET @sSQL = 'SELECT @Turn = ' + @FieldValue +
' FROM ' + @TableName
+ ' WHERE ' + @FieldText + ' = '' + @WhereValue +
'' ORDER BY ' + @FieldText
exec sp_executesql @sSQL, N'@Turn nvarchar(100) out', @Turn=@Turn out
SELECT @Turn
RETURN </P>
evgenybe вне форума  
Старый 13.11.2006, 20:03   #20
bazile
Местный
 
Регистрация: 05.01.2001
Сообщений: 6,924
bazile пока не определено
По умолчанию RE: Проблема в названии поля

Ты забыл про параметр @WhereValue
exec sp_executesql @sSQL, N'@WhereValue nvarchar(100), @Turn nvarchar(100) out', @WhereValue=@WhereValue, @Turn=@Turn out
bazile вне форума  
Ads
Ответ
Опции темы

Похожие темы
Тема Автор
SQL Server SQL 2005:Integration Services -Foreach Loop Container
Мне надо было перевести даные с одной ДБ на другую. Сделала в SSIS Packge Import and Export на перевод 5 таблиц. Сейчас понадобилось добавить еще несколько таблиц и не могу найти,как это...
mayyakom
SQL Server Ошибка:Failed to restart the current database
У меня есть процедура: set ANSI_NULLS ON set QUOTED_IDENTIFIER ON GO ALTER PROCEDURE . @nameFile nvarchar(100) AS BEGIN
mayyakom
Как не апдейтить некоторые поля в зависимости от условий? SQL Server
Имеется две таблицы. В каждой из них довольно много полей. Каждую ночь проводится Job, заключающаяся в том что запускается Stored Procedure, которая берет поля из первой таблицы и делает Update...
evgenybe
SQL Server Прошу помощи в написании запроса.
Нужно написать запрос, результатом которого будет выборка уникальных значений "Поле1" да так, что среди равных будут выбраны строки с наибольшим значением в "Поле2". Данные такого плана: ...
Eilede
как узнать количество свободных лицензий ? SQL Server
-когда не хватает лицензий, пользователь А звонит админу базы и сообщает ему об этом - админ звонит пользователю В и просит освободить лицензию, если работа у него не срочная - пользователь В...
kostic
Как SQL запросом запустить на выполнение заранее созданный Local Package DTS? SQL Server
Это вообще возможно?
Eilede



Текущее время: 06:04. Часовой пояс GMT +4.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.

Рейтинг@Mail.ru