2

SQL Server 2005 では、複数の値を次のように挿入できます。

INSERT INTO
TableName
(col1, col2, col3)
SELECT
'text1', 'text2', 1
UNION ALL
'text3', 'text4', 2

動的SQLを使用して挿入するにはどうすればよいですかEXEC @sql

私が走るとき

EXEC '  INSERT INTO
    TableName
    (col1, col2, col3)
    SELECT
    ''text1'', ''text2'', 1 -- using double quotation marks to escape
    UNION ALL
    ''text3'', ''text4'', 2
 '

というエラーが表示されます

間違った構文

'INSERT INTO Tablename(col1, col2, col3) SELECT 'text1', 'text2', 1 UNION ALL SELECT '.

なぜ実行されないのですか?また、SQL が入力した SQL ステートメント全体を出力しないのはなぜですか? 2番目の選択後にトリミングされるのはなぜですか?

誰か私がこれを書くのを手伝ってくれますか?

編集

解決策を試した後Devart's。SQL Server で正常に動作し、ASP.NET アプリケーションからも動作しました。しかし、問題は、テキストのいずれかにスペースがある場合に発生します。

EXEC ('
 INSERT INTO TableName (col1, col2, col3)
 SELECT ''text1'' AS t1, ''text2'' AS t2, 1 AS t3
 UNION ALL
 SELECT ''text3'', ''text4'', 2
')

これはうまくいきます...

しかし

EXEC ('
 INSERT INTO TableName (col1, col2, col3)
 SELECT ''text1'' AS t1, ''text2'' AS t2, 1 AS t3
 UNION ALL
 SELECT ''text3 with space in it'', ''text4 more spaces'', 2
')

SSMS でのみ正常に動作しますが、asp.net アプリケーションからは動作しません。

コードは次のとおりです。

var cmd = new SqlCommand 
{ commandText = "myProcedure", commandType = CommandType.StoredProcedure, connection = myGlobalConnection };

cmd.Parameters.AddWithValue("@sqlParam", thatLongDynamicString);
cmd.ExecuteNonQuery();

throw はIncorrect syntax errornearwithおよび nearmoreです、テキスト列にスペースがない場合。それは正常に動作します。

なぜこうなった?

4

2 に答える 2

2

これを試してみてください -

DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL =  '
 INSERT INTO TableName (col1, col2, col3)
 SELECT ''text1'' AS t1, ''text2'' AS t2, 1 AS t3
 UNION ALL
 SELECT ''text3'', ''text4'', 2'

EXEC sys.sp_executesql @SQL

またはこれを試してください -

EXEC ('
 INSERT INTO TableName (col1, col2, col3)
 SELECT ''text1'' AS t1, ''text2'' AS t2, 1 AS t3
 UNION ALL
 SELECT ''text3'', ''text4'', 2
')

アップデート:

Dynamic SQLあなたの場合に使用するのは悪い習慣だと思います。これをパラメーターとして使用して、クライアントから生成XMLし、ストアドプロシージャを実行してみXMLてください。例えば:

IF OBJECT_ID ('dbo.usp_InsertData') IS NOT NULL
   DROP PROCEDURE dbo.usp_InsertData
GO

CREATE PROCEDURE dbo.usp_InsertData
    @Data XML
AS BEGIN

    --INSERT INTO <your_table> (...)
    SELECT 
          t.c.value('@col1', 'NVARCHAR(MAX)') 
        , t.c.value('@col2', 'NVARCHAR(MAX)') 
        , t.c.value('@col3', 'INT') 
    FROM @Data.nodes('root/item') t(c)

END
GO

DECLARE @XML XML
SELECT @XML = '
<root>
    <item col1="text3" col2="text4" col3="1"/>
    <item col1="text3 with space in it" col2="text4 more spaces" col3="2"/>
</root>'

EXEC dbo.usp_InsertData @XML

出力:

于 2013-09-03T10:11:34.213 に答える
1

これを試すことができます。これは機能します。

DECLARE @Sql VARCHAR(MAX)

SET @Sql = '
insert into temp (id,name,address) 
SELECT 1,''text1'', ''text2'' 
UNION ALL 
select 2,''text3'', ''text4'''

--PRINT @Sql
EXEC (@Sql)

SELECT *
FROM temp

あなたはSelect後 に行方不明ですUnion all

SQL フィドル

**EDIT**

この C# コードを試す

    StringBuilder sbQuery = new StringBuilder();
    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
    if (con.State == ConnectionState.Closed)
    {
        con.Open();
    }
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = con; //Your connection string"        
    sbQuery.Append("insert into temp (id,name,address) SELECT 1,'text1', 'text2' UNION ALL select 2,'text3', 'text4'"); // your query goes here
    cmd.CommandText = "Testing1"; // your procedure name
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add(new SqlParameter("@SQL",sbQuery.ToString()));
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    DataSet ds = new DataSet();
    da.Fill(ds);
    DataTable dt = new DataTable();
    dt = ds.Tables[0];
    GridView1.DataSource = dt;
    GridView1.DataBind();  

あなたの店の手順

CREATE PROCEDURE Testing1
@SQL varchar(Max)
AS
/* SET NOCOUNT ON */        
exec (@SQL)
select * from temp
RETURN
于 2013-09-03T10:25:00.483 に答える