6

私は以下のスクリプトに苦労してきましたが、それを行うためのより良い方法を見つけることができません。
誰かが問題を見ていますか?変数を正しく宣言しています。なぜ失敗するのですか?ご協力いただきありがとうございます!

DECLARE @var1 as VarChar(50) 
DECLARE @var2 as VarChar(50) 

SET @Var1 = '1, 2, 3, 4, 5'

EXEC('IF (select count(*) from Table1 where Column1 in (' + @Var1 + ')) = 5 
     SET @Var2 = ''True''
ELSE 
     SET @Var2 = ''False''')

SELECT @Var2

エラーメッセージ:

スカラー変数@Var2を宣言する必要があります

4

5 に答える 5

10

sp_executesqlパラメータから値を取得する場合に使用する必要があります。

クエリを短縮するには、を使用しますCASE

DECLARE @var1 as VarChar(50) 
DECLARE @var2 as VarChar(50) 
SET @Var1 = '1, 2, 3, 4, 5'
SET @sqlCommand = 'SELECT @Var = CASE WHEN count(*) = 5 THEN ''TRUE'' ELSE ''FALSE'' END FROM Table1 where Column1 IN (' + @Var1 + ')'
EXECUTE sp_executesql @sqlCommand, N'@Var VARCHAR(5) OUTPUT', @Var=@var2 OUTPUT
SELECT @Var2

IDfromがすべてテーブルに存在するかどうかを知りたい場合@Var1は、次も使用する必要があります。DISTINCT

SET @sqlCommand = 'SELECT @Var = CASE WHEN count(DISTINCT Column1) = 5 THEN ''TRUE'' ELSE ''FALSE'' END FROM Table1 where Column1 IN (' + @Var1 + ')'
于 2013-03-08T02:27:45.527 に答える
4

execは、一重引用符で囲まれたSQLの動的な部分を実行しているためです。ただし、@var2はexecの外部で宣言されています。この宣言を解決するには、exec内で@ var2を選択するか、@var2をset'+ @var2+'として使用します。

于 2013-03-08T02:40:37.807 に答える
3

execの代わりにsp_executeSQLを使用し、出力パラメーターを使用します

たとえば、sp_executesqlの結果を変数に取り込む方法は?

例えば

DECLARE @var1 as VarChar(50) 
DECLARE @var2 as VarChar(50) 
DECLARE @ParmDefinition nvarchar(500);
SET @Var1 = '1, 2, 3, 4, 5'

SET @ParmDefinition = N'@Var2  VarChar(50) OUTPUT';

DECLARE @sSQL nvarchar(500);

set @sSQL =  'IF (select count(*) from Table1 where Column1 in (' + @Var1 + ')) = 5 
     SET @Var2 = ''True''
ELSE 
     SET @Var2 = ''False'''

EXEC sp_executesql @sSQL, @ParmDefinition, @Var2=@Var2 OUTPUT;

SELECT @Var2;
于 2013-03-08T02:22:30.973 に答える
1

そこには2つのことがあります。最初に「;」はどこにありますか。文を終了します。また、varchar値をエスケープする必要があります。

他の答えに同意します...sp_executeSQLを使用して動的SQLを実行します。

宣言の例...

USE AdventureWorks2012;
GO
DECLARE @find varchar(30); 
/* Also allowed: 
DECLARE @find varchar(30) = 'Man%'; 
*/
SET @find = 'Man%'; 
SELECT p.LastName, p.FirstName, ph.PhoneNumber
FROM Person.Person AS p 
JOIN Person.PersonPhone AS ph ON p.BusinessEntityID = ph.BusinessEntityID
WHERE LastName LIKE @find; 

sp_executeSQLの例。

DECLARE @IntVariable int;
DECLARE @SQLString nvarchar(500);
DECLARE @ParmDefinition nvarchar(500);

/* Build the SQL string one time.*/
SET @SQLString =
     N'SELECT EmployeeID, NationalIDNumber, Title, ManagerID
       FROM AdventureWorks.HumanResources.Employee 
       WHERE ManagerID = @ManagerID';
SET @ParmDefinition = N'@ManagerID tinyint';
/* Execute the string with the first parameter value. */
SET @IntVariable = 197;
EXECUTE sp_executesql @SQLString, @ParmDefinition,
                      @ManagerID = @IntVariable;
/* Execute the same string with the second parameter value. */
SET @IntVariable = 109;
EXECUTE sp_executesql @SQLString, @ParmDefinition,
                      @ManagerID = @IntVariable;
于 2013-03-08T02:22:59.447 に答える
0

SQL文字列の実行を避ける理由はたくさんあります。私はこれを次のように書き直します:

declare @cnt int

select @cnt = count(1) 
from Table1 
where Column1 in
    (select items
    from dbo.Split(@Var1,',')
    )

return @cnt   -- then the calling function says if this is true or false.

分割機能については、 こちらをご覧ください。

于 2013-03-08T02:37:51.777 に答える