テーブルの1つにsmalldatetime列があり、デフォルト値は2012年1月1日です。
後で、実際のデフォルト値が正しい値に設定されていることを確認したいと思います。ただし、INFORMATION_SCHEMA.COLUMNSから値を読み戻すと、SQLにフォーマットが追加されています。次のコードは私の問題を示しています
DECLARE
@Requireddefaultdate smalldatetime = 'Jan 1 2012',
@Actualdefaultdate smalldatetime,
@Actualdatestring nvarchar (128) ;
CREATE TABLE dbo.mytable
(thedate smalldatetime CONSTRAINT df_mytable_thedate DEFAULT
CAST('Jan 1 2012' AS smalldatetime)
) ;
INSERT INTO mytable DEFAULT VALUES;
SET @Actualdatestring = (SELECT column_default
FROM information_schema.columns
WHERE table_name = 'mytable') ;
PRINT @Actualdatestring; --result: (CONVERT([smalldatetime],'Jan 1 2012',0))
--Now I would like to convert @actualdatestring to smalldatetime
--so I can compare it to @requireddefaultdate
SET @Actualdefaultdate = @Actualdatestring; -- gives error 'Conversion failed
-- when converting character string to smalldatetime data type.'
SET @Actualdefaultdate = CAST((@Actualdatestring)AS smalldatetime);
--gives same error as above
--Added below - this is the script I used for dynamic sql
declare @dynsql nvarchar(500), @paramdef nvarchar(500);
-- SET @dynsql = N'Set @param_actdate = CAST(@param_defaultstr AS smalldatetime)';
--Above line changed as below in response to comment/answers.
--Now get single error: Incorrect syntax near '=' but seems to be closer to a correct solution.
SET @dynsql = ' ''Set '' + @param_actdate + '' = (Select '' + @param_defaultstr + '' )'' ';
SET @paramdef = N'@param_actdate = @Actualdefaultdate output,
@param_defaultstr = @Actualdatestring';
EXECUTE sp_executesql @dynsql, @paramdef,
@param_actdate = @Actualdefaultdate output, @param_defaultstr = @Actualdatestring;
--finally drop the table
DROP TABLE dbo.mytable;
また、パラメーターを指定してsp_executesqlを使用して変換を実行しようとしましたが、成功しませんでした(このスクリプトは上記に追加されています)。
@actualdatestringの日付部分だけを抽出するために文字列操作を行うことはできますが、もっとエレガントな方法が必要だと感じており、明らかな何かが欠けています
ご協力いただきありがとうございます