динамический sql - пытается сохранить значение - PullRequest
1 голос
/ 23 марта 2011

Привет, я пытаюсь сохранить [Field ID] в @fieldID, чтобы я мог использовать его в другой точке SP. пробовал различные комбинации, но я в основном получаю ошибки «Преобразование не удалось при преобразовании значения varchar ... в тип данных int. [Идентификатор поля] - это int и первичный ключ. я даже пытался разыграть [идентификатор поля], просто чтобы убедиться, что он все еще не работает.

Declare @fieldID as int
Declare @sql1 as varchar(1000)
set @sql1 = 'select '+@fieldID+' = [Field ID] from ['+@DataBaseName+'].dbo.[Custom Field Definition] where [Name] = ''Roster Y/N'' and [Table Type] = 0'
  --print @sql1
  exec(@sql1)

если я удаляю «+ @ fieldID +», я получаю верное значение. я знаю, что это не работает, но есть что-то вроде set @fieldID = exec (@ sql1)?

спасибо за помощь!
Дэйв К.

Ответы [ 2 ]

3 голосов
/ 23 марта 2011

set @fieldID = exec (@ sql1)

вам нужно использовать SP_EXECUTESQL с OUTPUT

вот пример

DECLARE @chvTableName VARCHAR(100),
@intTableCount INT,
@chvSQL NVARCHAR(100)

SELECT @chvTableName = 'Authors'
SELECT @chvSQL = N'SELECT @intTableCount = COUNT(*) FROM ' + @chvTableName

EXEC sp_executesql @chvSQL, N'@intTableCount INT OUTPUT', @intTableCount OUTPUT

SELECT @intTableCount
GO

Итак, попробуйте это

DECLARE @DataBaseName VARCHAR(100),
@fieldID INT,
@chvSQL NVARCHAR(300)

SELECT @chvSQL = N'SELECT @fieldID =[Field ID]  from ['+@DataBaseName+'].dbo.[Custom Field Definition] where [Name] = ''Roster Y/N'' and [Table Type] = 0'

EXEC sp_executesql @chvSQL, N'@fieldID INT OUTPUT', @fieldID OUTPUT

SELECT @fieldID
GO
0 голосов
/ 23 марта 2011

Простой ответ - преобразовать ваше fieldId в varchar

 Declare @fieldID as int
 Declare @sql1 as varchar(10)
 set @sql1 = 'select '+ Convert(varchar(100),@fieldID)
 exec(@sql1)

Но, как предполагает SQLMenace, используйте SP_ExecuteSQL

...